gpt4 book ai didi

java - 使用带有 OCI 驱动程序的 OracleDataSource 获取失效连接

转载 作者:搜寻专家 更新时间:2023-11-01 03:28:51 25 4
gpt4 key购买 nike

当我的 Java 应用程序在几个小时内没有对数据库的请求时,我收到过时的连接错误。

它是一个简单的 java 应用程序,运行在带有 OCI(类型驱动程序)的 Linux 机器上。不要问我为什么OCI,为什么不瘦。我正在使用 OracleDataSourceOracleConnectionCacheManager 来维护连接对象的缓存。这是代码片段:

import java.sql.Connection; 
import java.sql.SQLException;
import java.util.Properties;

import oracle.jdbc.pool.OracleConnectionCacheManager;
import oracle.jdbc.pool.OracleDataSource;

import org.apache.log4j.Logger;

import com.exception.DataException;

public class ConnectionManager {
private static OracleDataSource poolDataSource = null;
private final static String CACHE_NAME = "CONNECTION_POOL_CACHE";
private static OracleConnectionCacheManager occm = null;

public static void init(String url,String userId,String password) throws PCTDataException{
Properties cacheProps = null;
try {
poolDataSource = new OracleDataSource();
poolDataSource.setURL(url);
poolDataSource.setUser(userId);
poolDataSource.setPassword(password);

cacheProps = new Properties();
cacheProps.setProperty("MinLimit", "1");
cacheProps.setProperty("MaxLimit", "5");
cacheProps.setProperty("InitialLimit", "1");
cacheProps.setProperty("ValidateConnection", "true");

poolDataSource.setConnectionCachingEnabled(true);
occm = OracleConnectionCacheManager.getConnectionCacheManagerInstance();
occm.createCache(CACHE_NAME, poolDataSource, cacheProps);
occm.enableCache(CACHE_NAME);
} catch (SQLException se) {
throw new DataException("SQL Exception while initializing connection pool");
}catch(Exception e){
throw new DataException("Exception while initializing connection pool");
}
}

public static Connection getConnection() throws PCTDataException {
try{
if (poolDataSource == null) {
throw new SQLException("OracleDataSource is null.");
}
occm.refreshCache(CACHE_NAME, OracleConnectionCacheManager.REFRESH_INVALID_CONNECTIONS);
Connection connection = poolDataSource.getConnection();
return connection;
}catch(SQLException se){
se.printStackTrace();
throw new DataException("Exception while getting Connection object");
}catch(Exception e){
e.printStackTrace();
throw new DataException("Exception while getting Connection object");
}
}

public static void closePooledConnections() {
try{
if (poolDataSource != null) {
poolDataSource.close();
}
}catch(SQLException se){
}catch(Exception e){
}

}
}

错误如下:

ConnectionManager.java:getConnection:87 - Exception while getting Connection object: 
java.sql.SQLException: Invalid or Stale Connection found in the Connection Cache
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208)
at oracle.jdbc.pool.OracleImplicitConnectionCache.getConnection(OracleImplicitConnectionCache.java:390)
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:404)
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:189)

我错过了什么?

最佳答案

也许你需要设置keep alives on?这是周期性的,当不使用时,它会向数据库服务器发送一个 ping,基本上说我还在这里,不要关闭我。尝试调试并不是那么有趣。问题可能是您的数据库服务器上的设置存在最长连接期限,或者是终止空闲连接的时间。您的池中也可能有一些设置,您可以使用这些设置来检查这一点,然后告诉它在发生这种情况时获取新的设置。我希望我能提供更多帮助,但我没有使用过 oracle。

关于java - 使用带有 OCI 驱动程序的 OracleDataSource 获取失效连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5966074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com