Rob*_*der 3 java sql-server jsf tomcat connection-pooling
我们在Windows Server 2008 R2上运行的Apache Tomcat 7.0.54上运行了一个JSF2.0 Web服务器.我们在运行它的机器上有2个SQL服务器,另一个托管我们的库存软件.我们网页的一部分是对要添加的PartNumbers的验证.在阅读了连接池是与SQL服务器交谈的最佳实践之后,我们创建了一个并使用它来对我们的库存软件进行一些验证.
因为我想要一种方法来检查连接池的运行状况,所以我创建了一个带有ViewScoped辅助bean的测试页面,该辅助bean验证了2个已知的好的部件号.今天是本周第二次出现错误信息"Connection is closed".由于我是新来的conenction池,似乎无法找到任何有关这方面的信息,我感到困惑的是我们没有正确设置.我刚刚重置Apache服务器,它已备份并运行.所以..为了创建我的连接池,我在应用程序的META-INF/context.xml中添加了一些代码.
<Resource type="javax.sql.DataSource"
name="jdbc/FOODB"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://Foobar\Inventory;databaseName=FooInventory;user=johnDoe;password=astrongpassword;"
/>
Run Code Online (Sandbox Code Playgroud)
我必须使用ConnectionPool的基本概念是我有一个名为SqlAccessCommand的接口.它或多或少是适配器模式.在我的测试页面中,我使用RunUnsafe方法,以便我可以显示错误消息.所以这是RunUnsafe方法.
protected static DataSource getDataSource() throws NamingException {
Context context = (Context) new InitialContext().lookup("java:/comp/env");
DataSource ds = (DataSource) context.lookup("jdbc/FOODB");
return ds;
}
public static <T> T RunUnsafe(SqlAccessCommand<T> command) throws NamingException, SQLException {
try {
DataSource ds = getDataSource();
try (Connection connection = ds.getConnection();
PreparedStatement statement = connection.prepareStatement(command.getSqlStatement())) {
command.prepareStatment(statement);
try (ResultSet rs = statement.executeQuery()) {
return command.getResults(rs);
}
}
} catch (NamingException | SQLException e) {
Logger.getLogger(AOSqlInformationHolder.class.getName()).log(Level.SEVERE, null, e);
throw e;
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,我使用try资源尝试在使用后关闭我的连接,无论如何.就像try/catch/finally一样,只是更干净(IMO).所以当我的连接打开时,这很好用.到目前为止2x现在我不得不重新启动服务器(因为我不知道如何以任何其他方式重新打开所述连接)我错过了什么?如果需要更多部分拼图,请给我留言,我会发布我能做的.谢谢.
编辑
只是查看了日志文件,今天早上抛出了这个异常
com.microsoft.sqlserver.jdbc.SQLServerException:通过对等方重置连接:套接字写入错误
根据迄今为止的评论,假设超时.此错误消息是否仍指向该方向?
您需要在连接池配置中添加一些选项1,以检测连接是否仍然有效.
最简单的方法是运行一个简单的SQL语句2来测试连接.
所以池配置可以是:
<Resource type="javax.sql.DataSource"
name="jdbc/FOODB"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://Foobar\Inventory;databaseName=FooInventory;user=johnDoe;password=astrongpassword;"
validationQuery="SELECT 1"
validationQueryTimeout="1000"
testOnBorrow="true"
/>
Run Code Online (Sandbox Code Playgroud)
笔记
| 归档时间: |
|
| 查看次数: |
4448 次 |
| 最近记录: |