首页 > 解决方案 > 在某些时候无法使用 JNDI 和 JDBC 建立连接

问题描述

当我尝试使用 JNDI 和 JDBC 从池中获取连接时,有时会出现错误。这个池也被 Hibernate 使用。

在某些时候,当我尝试建立新连接时,它会停留在获得新连接的位置。

我的游泳池示例

<Resource name="jdbc/db"
        auth="Container"
        description="some Database ${env}"
        type="javax.sql.DataSource"
        driverClassName="oracle.jdbc.OracleDriver"
        maxIdle="10"
        minIdle="8"
        maxWait="5000"
        maxActive="150"
        removeAbandoned="true"
        removeAbandonedTimeout="30"
        accessToUnderlyingConnectionAllowed="true"
        testWhileIdle="true"
        logAbandoned="true"
        validationQuery="select 1 from dual"
        username="${db.db.username}"
        password="${db.db.password}"
        url="${db.db.url}" 
    />

我的类使用 JDBC 和 JNDI 的示例

public class JDBCFactory {

    private static final Log log = LogFactory.getLog(JDBCFactory.class);
    
    private static ThreadLocal<Connection> DBConnection = new ThreadLocal<>();

    private JDBCFactory() {
        
    }

    public static  Connection getDBInstance() throws InternalServiceException {
        log.debug("Entering => getDBInstance");
        Connection connection = DBConnection.get();
        log.debug("Connection a this point " + connection);
        
        try {
            if(connection == null || connection.isClosed()) {
                // Look up the JNDI data source only once at init time
                InitialContext ctx = new InitialContext();
                log.debug("Obteniendo el contexto de la aplicacion " + ctx);
                
                connection = ((DataSource) ctx.lookup(Constant.JNDI.DB_JNDI.label)).getConnection();
                
                log.debug("Se obtubo la conexion " + connection);
                DBConnection.set(connection);
            }
            
            return DBConnection.get();
                
        } catch (NamingException | SQLException e) {
            log.error(e.getMessage(),e);
            throw new InternalServiceException(e);
        }finally {
            log.debug("Exiting => getDBInstance");
        }
    }
}

这是我的 application-dao.xml 的示例

<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="SessionFactory" />
    </bean>
    
    <!-- Session factory -->
    <bean id="SessionFactory" class="org.springframework.orm.hibernate5.annotation.AnnotationSessionFactoryBean">
        <property name="annotatedClasses">
            <list>
                List of entities ....
            </list>
        </property>
        <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
        <property name="hibernateProperties">
            <props>     
                <prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>           
                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
                <prop key="hibernate.show_sql">false</prop>
                <prop key="hibernate.format_sql">true</prop> 
                <prop key="hibernate.default_schema">SCHEMA</prop>              
            </props>
        </property> 
        <property name="dataSource">
            <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/db" />
        </property>     
    </bean>

标签: javahibernatejdbcdatasourcejndi

解决方案


推荐阅读