SQLServerXADataSource接口的文档说明,它提供连接池,每当客户端完成连接时,都应该调用close()方法;在这种情况下,连接不会关闭,而是返回到池中。我正在尝试这个,但是下一次我尝试连接时,它说连接已经关闭了。如何使用此接口实现连接池?
提供连接的类是:
public class ConnectionPool {
SQLServerXADataSource ds;
Decoder dec = Base64.getDecoder();
Connection connection = null;
public ConnectionPool(InputStream inputStream) throws Exception {
ds = new SQLServerXADataSource();
boolean res = Config.load(inputStream);
if (res) {
ds.setServerName(Config.SQL_SERVER());
ds.setDatabaseName(Config.SQL_DB_NAME());
ds.setIntegratedSecurity(Config.SQL_INTEGRATED_SECURITY());
ds.setPortNumber(Config.SQL_PORT());
if (!Config.SQL_INTEGRATED_SECURITY()) {
ds.setUser(Config.SQL_USERNAME());
ds.setPassword(new String(dec.decode(Config.SQL_USER_PASSWORD())));
}
} else {
throw new Exception("Failed to load parameters.");
}
connection = ds.getConnection();
}
public Connection getConnection() throws SQLServerException {
return this.connection;
}
}在创建ConnectionPool对象之后(当用户登录时),我将其保存为会话属性,以便servlet能够在需要时获得它。
请提供一个利用此接口在web应用程序中实现连接池的示例。我知道我做得不对,但我不知道问题出在哪里。
发布于 2016-02-09 13:57:17
您将在构造函数中创建一次连接。如果关闭此连接,则关闭此连接(即使物理句柄返回到连接池)。相反,您的getConnection方法应该执行如下操作:
public Connection getConnection() throws SQLServerException {
return ds.getConnection();
}或者更好的是:只提供对数据源本身的访问,而不是引入不必要的包装器。
然而,据我所知,SQLServerXADataSource是,而不是,是连接池。它是XA连接的工厂(您在代码示例中没有使用它),也扩展了SQLServerConnectionPoolDataSource (它是连接池使用的连接工厂,而不是连接池本身)。
Java的方法是定义一个JNDI数据源(可以使用SQLServerXADataSource或SQLServerConnectionPoolDataSource作为其工厂),然后从JNDI注入(或获取)该数据源。
发布于 2016-02-09 11:20:02
数据库可能会关闭连接,这不是连接池的正确实现。如果您想了解有关连接池的更多信息,可以阅读commons-dbcp项目或c3p0。这里是实现连接池的数据源的示例。
https://stackoverflow.com/questions/35290315
复制相似问题