java - 在某些时候无法使用 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>
解决方案
推荐阅读
- python - 如何使用 uuid 创建自定义字段?
- python - 训练后如何获得模型的最高准确率
- flutter - 仅从 Flutter 中的完整日期中提取年份
- android - 如何修复:DexCountException:无法运行 dx
- angular - Angular 11:Msal Angular V2 包的问题
- python-3.x - 有没有办法将 python 与入侵检测系统集成?(描述中的详细问题)
- android-studio - 使用滑动手势在 Android Studio 中导航不同的屏幕?
- javascript - 如果选中,如何获取复选框下拉值?
- python - 将 x 天添加到今天的日期,其中 x 太大而无法转换
- angular - 使用@ngrx/data,您如何在自定义数据服务上形成从更新到实体的 JSON 补丁文档?