有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无法获取JDBC连接关闭问题

在生产环境中,我遇到了以下错误

org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Cannot create PoolableConnectionFactory (The Network Adapter could not establish the connection)

当我通过蟾蜍连接时,它说ORA-12541没有监听错误。重新启动linstener后,问题得到解决

但实际的问题可能是web应用程序打开了很多连接,但它并没有关闭这些连接。以下是我的代码和配置

我正在使用EcllipseLink、dbcp2进行连接

<persistence-unit name="persistance-unit" transaction-type="RESOURCE_LOCAL">
        <class>com.company.model.Characteristic</class>
        ...
        <!--more classes -->

        <exclude-unlisted-classes>true</exclude-unlisted-classes>

        <properties>
            <property name="eclipselink.weaving" value="false"/>
        </properties>

    </persistence-unit>

dbcp2设置

<bean id="datasource" class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="maxIdle" value="10" />
        <property name="maxTotal" value="200" />
        <property name="maxWaitMillis" value="60000" />
        <property name="validationQuery" value="select 1 from dual" />
        <property name="validationQueryTimeout" value="10" />
        <property name="testOnBorrow" value="true" />
        <property name="testWhileIdle" value="true" />
        <property name="timeBetweenEvictionRunsMillis" value="30000" />
        <property name="minEvictableIdleTimeMillis" value="60000" />
        <property name="numTestsPerEvictionRun" value="5" />
        <property name="defaultAutoCommit" value="true" />
    </bean>

连接工厂

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="persistance-unit"/>
        <property name="dataSource" ref="datasource"/>

        <property name="jpaVendorAdapter">
            <bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
                <property name="showSql" value="true"/>
                <property name="database" value="ORACLE"/>
            </bean>
        </property>
</bean>

交易管理

抽象泛指

public abstract class  GenericDao<T> implements IGenericDao<T> {

    @PersistenceContext
    protected EntityManager entityManager

    private Class<T> type


    public GenericDao() {
        Type t = getClass().getGenericSuperclass()
        ParameterizedType pt = (ParameterizedType) t
        type = (Class) pt.getActualTypeArguments()[0]
    }

    @Override
    public T save(final T t) {
        this.entityManager.persist(t)
        return t
    }

    public def saveObj(def t) {
        try {
            this.entityManager.persist(t)
        }catch(e){
            log.info("Error occured: ", e)
        }
        return t
    }

    @Override
    public void delete(final Object id) {
        this.entityManager.remove(this.entityManager.getReference(type, id))
    }

    @Override
    public T find(final Object id) {
        return (T) this.entityManager.find(type, id)
    }

    @Override
    public T update(final T t) {
        return this.entityManager.merge(t)    
    }

    @Override
    public def executeNamedQuery(String namedQueryName, Map<String, Object> queryParams)
    {
      List results = null
      try {
        Query query = entityManager.createNamedQuery(namedQueryName)
        if (queryParams) {
          addPrametersToQuery(query, queryParams)
        }
        results = query.getResultList()
      } catch (NoResultException e) {
      } catch (Exception e) {
        log.error("Error occured: ", e)
        throw e
      }
      return results
    }       
}

使用该泛型Dao的Dao组件

@Component("characteristicDao")
class CharacteristicDao extends GenericDao<Characteristic> implements ICharacteristicDao {

    public def getCharacteristics(String name){
        log.info("Entering getCharacteristics")
        Characteristic characteristic = (PrmCharacteristic) executeQueryWithSingleResult("select b from Characteristic b where b.name=:name", [name:name])
        log.info("Exiting getCharacteristics")
        return characteristic
    }
}

我使用CharacteristicDao组件与数据库交互。同样,我也有其他刀。我刚才举了一个例子

我在事务中使用@Transactional。我做错了什么,任何大师都能帮我


共 (0) 个答案