gpt4 book ai didi

java - 传统的数据库单例连接效果不佳

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:17:44 25 4
gpt4 key购买 nike

我在我的 java 应用程序中使用单例数据库连接,这里是我的连接管理器类的代码:

public abstract class DatabaseManager {
//Static instance of connection, only one will ever exist
private static Connection connection = null;
private static String dbName="SNfinal";
//Returns single instance of connection
public static Connection getConnection(){
//If instance has not been created yet, create it
if(DatabaseManager.connection == null){
initConnection();
}
return DatabaseManager.connection;
}
//Gets JDBC connection instance
private static void initConnection(){
try{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String connectionUrl = "jdbc:sqlserver://localhost:1433;" +
"databaseName="+dbName+";integratedSecurity=true";

DatabaseManager.connection =
DriverManager.getConnection(connectionUrl);
}
catch (ClassNotFoundException e){
System.out.println(e.getMessage());
System.exit(0);
}
catch (SQLException e){
System.out.println(e.getMessage());
System.exit(0);
}
catch (Exception e){
}
}
public static ResultSet executeQuery(String SQL, String dbName)
{
ResultSet rset = null ;
try {
Statement st = DatabaseManager.getConnection().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
rset = st.executeQuery(SQL);
//st.close();
}
catch (SQLException e) {
System.out.println(e.getMessage());
System.exit(0);
}
return rset;
}

public static void executeUpdate(String SQL, String dbName)
{
try {
Statement st = DatabaseManager.getConnection().createStatement();
st.executeUpdate(SQL);
st.close();
}

catch (SQLException e) {
System.out.println(e.getMessage());
System.exit(0);
}
}
}

问题是我的代码在开始时工作完美,但随着时间的推移它变得非常慢。是什么导致了这个问题,我该如何解决?在开始时,我的应用程序每秒处理大约 20 个查询,运行 1 小时后达到每秒 10 个查询,运行 3 天后达到每 10 秒 1 个查询!P.S:我的应用程序是一个单用户应用程序,它通过数据库进行许多查询。P.S:这是我在 eclipse.ini 中的 JVM 参数:

--launcher.XXMaxPermSize
512M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
512m
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.6
-Xms500m
-Xmx4G
-XX:MaxHeapSize=4500m

不幸的是,数据库是远程的,我无法对其进行任何监控以了解那里发生了什么。

这是我的用法示例:

String count="select count(*) as counter from TSN";
ResultSet rscount=DatabaseManager.executeQuery(count, "SNfinal");
if(rscount.next()) {
numberofNodes=rscount.getInt("counter");
}

最佳答案

What caused that problem and how can i fix that?

这里的主要问题是 executeQuery() 方法。您没有关闭 Statement,我想您已经注释了 st.close() 行,因为您需要打开 ResultSet进行进一步处理。我知道您的想法是避免在您的应用程序中看到重复的 JDBC 代码,但这不是正确的方法。

规则是:关闭ResultSet,然后关闭Statement,否则你没有正确释放资源,你就会遇到你所描述的那种问题。

Here你可以找到关于如何正确关闭资源的很好的解释(请记住,在你的情况下你不需要关闭连接)

编辑:一个例子可以是

try{
Statement st = DatabaseManager.getConnection().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rsCount = st.executeQuery(count); //count="select count(*) as counter from TSN";
if(rsCount.next()) {
numberofNodes=rscount.getInt("counter");
}
} catch (SQLException e) {
//log exception
} finally {
rsCount.close();
st.close();
}

关于java - 传统的数据库单例连接效果不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20716169/

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