Java 在重新连接到数据库后,如何重用JDBC中的语句?
我与MySQL数据库的JDBC连接在10秒不活动后过期。在我重新连接之后,我无法进行任何查询,它一直在问我是否要重新连接,就好像连接仍然关闭一样 我有:Java 在重新连接到数据库后,如何重用JDBC中的语句?,java,mysql,jdbc,Java,Mysql,Jdbc,我与MySQL数据库的JDBC连接在10秒不活动后过期。在我重新连接之后,我无法进行任何查询,它一直在问我是否要重新连接,就好像连接仍然关闭一样 我有: 1.一个名为st的全局语句, 2.名为rs的全局结果集, 3.称为conn的全局连接, 4.设置连接的方法setConnection, 5.checkConnection方法,用于检查连接是否处于活动状态,如果未处于活动状态,则调用setConnection方法以建立新连接, 6.调用checkConnection的按钮,如果返回的布尔值为tr
1.一个名为st的全局语句,
2.名为rs的全局结果集,
3.称为conn的全局连接,
4.设置连接的方法setConnection,
5.checkConnection方法,用于检查连接是否处于活动状态,如果未处于活动状态,则调用setConnection方法以建立新连接,
6.调用checkConnection的按钮,如果返回的布尔值为true,则执行查询
private Connection conn = null;
private Statement st=null;
private ResultSet rs=null;
public void setConnection(){
host="localhost";
database="test";
username="testtest";
password="testtest";
String url = "jdbc:mysql://" + host + "/" +database+ "";
try {
Class.forName ("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection (url, username, password);
System.out.println("Succesfuly connected to the database!");
} catch(Exception e){
System.out.println("Failed to connect to the database.");
e.printStackTrace();
}
}
private boolean checkConnection(){
try {
ResultSet cc = st.executeQuery("SELECT 1");
return true;
} catch (SQLException e) {
int n = JOptionPane.showConfirmDialog(
frame,
"The connection was closed, reconnect?",
"Database security measure",
JOptionPane.YES_NO_OPTION);
if(n == JOptionPane.YES_OPTION){
try {
conn.close();
} catch (SQLException e1) {
e1.printStackTrace();
}
setConnection();
} else if ( n == JOptionPane.NO_OPTION){
frame.setVisible(false);
new LoginWindowB();
}
return false;
}
}
btn1.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
if(checkConnection()){
try {
rs = st.executeQuery("SELECT * FROM " + selectedTable);
loadData(rs);
} catch (SQLException e) {
e.printStackTrace();
}
} else {
}
}
});
我如何处理这个重新连接问题,以及为什么在建立新连接后查询不起作用?在您的示例中,我看不出您在哪里初始化
st
,但它闻起来像是罪魁祸首。创建新连接时,还必须创建新语句
所有PreparedStatement
都附加到客户端,并将通过连接关闭
使用连接池管理器库可能更容易
在重新连接到数据库后,如何在JDBC中重用语句
你不能
我有:
1.一个名为st
已经错了。不能有全局语句。语句与创建它们的连接是同延的。应该有一个局部变量`语句。它不可能是全球性的
rs
ResultSet
与从中创建它的语句同时终止。它应该是一个局部变量。它不可能是全球性的
一个名为conn的全局连接
又错了。您应该使用连接池,并具有*局部变量conn
设置连接的方法setConnection
又错了。它应该是一个返回新连接的方法getConnection()
checkConnection方法,用于检查连接是否处于活动状态,如果未处于活动状态,则调用setConnection方法以建立新连接
又错了。这种方法甚至不应该存在。这是连接池的作业
调用checkConnection的按钮,如果返回的布尔值为true,则执行查询
又错了。它应该是一个按钮,用于:
从getConnection()
使用Connection.createStatement()或Connection.prepareStatement()创建语句
执行语句,遍历结果集
,并用结果行填充它必须填充的内容
您的代码片段不够完整,无法进行分析。您没有显示语句对象的初始化或处理,这在这里可能很重要。您还没有包括问题的细节(例如堆栈跟踪),这将有助于进一步查明手头的问题。实际上,从您的回答中,我找到了解决方案。st只初始化了一次,当我重新连接时,它没有再次初始化它。在调用setConnection()之后,我添加了st inside checkconnection的初始化;方法和它完美的工作。是的,这正是我所说的。。。很高兴你找到了答案。