2 回答
TA贡献1852条经验 获得超7个赞
我在静态连接对象线程中的使用安全吗?
绝对不是!
这样,连接将在所有用户发送的所有请求之间共享,因此所有查询都会相互干扰。但是线程安全并不是您唯一的问题,资源泄漏也是您的另一个问题。在整个应用程序的生命周期中,您将保持一个连接处于打开状态。当连接打开时间太长时,普通数据库就会恢复连接,这通常在30分钟到8小时之间,这取决于DB的配置。因此,如果您的Web应用程序运行时间超过此时间,则连接将丢失,您将无法再执行查询。
当这些资源被视为非-static
被多次重用的类实例的实例变量。
你应该总获取并关闭连接、语句和结果集。最短可能范围,最好是在完全相同的内部try-with-resources
块按照以下JDBC习语执行查询的位置:
public User find(String username, String password) throws SQLException { User user = null; try ( Connection connection = dataSource.getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT id, username, email FROM user WHERE username=? AND password=md5(?)"); ) { statement.setString(1, username); statement.setString(2, password); try (ResultSet resultSet = statement.executeQuery()) { if (resultSet.next()) { user = new User(); user.setId(resultSet.getLong("id")); user.setUsername(resultSet.getString("username")); user.setEmail(resultSet.getString("email")); } } } return user;}
注意你应该不返回aResultSet
这里。您应该立即读取它并将其映射到一个非JDBC类,然后返回它,以便ResultSet
可以安全关闭。
如果您还没有使用Java 7,那么使用try-finally
块,在该块中,您在获取资源时以相反的顺序手动关闭可关闭资源。
如果您担心连接性能,那么您应该使用连接池。这是内置到许多JavaEE应用服务器中的,甚至像Tomcat这样的基本服务容器也支持它。只需在服务器本身中创建一个JNDI数据源,并让您的webapp抓取它DataSource
..它显然已经是一个连接池了。您可以在下面列表的第一个链接中找到一个示例
TA贡献1900条经验 获得超5个赞
Select
searchUser
Connection
添加回答
举报