我有一个服务器向远程主机提交查询以从数据库访问帐户信息以登录游戏服务器。问题是连接随机超时,但我正在使用DataSource,它应该自动重新建立任何丢失的连接。任何人都知道如何解决这个问题?
public class Database {
private final PoolingDataSource source;
public Database(String driver, String url, String user, String password)
throws ClassNotFoundException {
Class.forName(driver);
source = createSource(url, user, password);
}
@SuppressWarnings({ "rawtypes", "unchecked", "unused" })
private PoolingDataSource createSource(String connectURI, String user,
String password) {
GenericObjectPool.Config config = new GenericObjectPool.Config();
config.maxActive = 150;
config.maxIdle = 100;
config.minIdle = 30;
config.maxWait = 1000;
config.testWhileIdle = true;
ObjectPool connectionPool = new GenericObjectPool(null, config);
ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
connectURI, user, password);
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(
connectionFactory, connectionPool, null, null, false, true);
PoolingDataSource poolingDataSource = new PoolingDataSource(
connectionPool);
return poolingDataSource;
}
public Connection getConnection() throws SQLException {
return getSource().getConnection();
}
public PoolingDataSource getSource() {
return source;
}
}
答案 0 :(得分:1)
“回到当天...”,在2003年,我正在使用Tomcat 4.1,并且发现它的DataSource实现需要你给它一个validationQuery,或者它只会初始化Connection一次,并且令人不快地感到惊讶。永远不要验证数据库服务器端是否仍然尊重连接。我认为,我们的Oracle服务器只会消除60分钟未使用过的连接。这样做的结果是,当我的服务器达到低容量时,我的一些池连接会在数据库服务器端被杀死,但应用程序服务器不知道,直到它试图以更高的容量使用它们。在这一点上,他们只是堆栈跟踪,这是它的结束。添加validationQuery具有DataSource本身的作用,使连接保持活动状态,一切正常。如果您有兴趣,这个发现过程的详细信息在https://groups.yahoo.com/neo/groups/seajug/conversations/messages/4902。
我建议您检查GenericObjectPool实现是否具有验证查询或心跳等概念,并弄清楚如何利用它来保持您的连接“新鲜”。