我与MySQL数据库的JDBC连接在10秒不活动后过期。重新连接后,我无法进行任何查询,它一直在问我是否要重新连接,就像连接仍然关闭一样。
我有:
1.一个名为st,
的全球声明
2.一个名为rs的全局ResultSet,
一个名为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 {
}
}
});
如何处理此重新连接问题以及为什么查询在设置新连接后无效?
答案 0 :(得分:1)
我不知道你在你的例子中初始化st
的位置,但它闻起来像罪魁祸首。创建新连接时,还必须创建新语句。
所有PreparedStatement
都附加到客户端,并将通过连接关闭。
使用连接池管理器库可能更容易。
答案 1 :(得分:1)
重新连接数据库后,如何在JDBC中重用
Statement
?
你不能。
我有: 1.名为
的全球Statement
st
错了。你不能拥有全局声明。语句与它们创建的连接是共同扩展的。你应该有一个本地变量`语句。它不可能是全球性的。
- 名为
的全球ResultSet
rs
醇>
再次错了。 ResultSet
与其创建的Statement
相同。它应该是一个局部变量。它不可能是全球性的。
- 一个名为conn的全局连接
醇>
再次错了。您应该使用连接 pool ,并且拥有*本地变量conn
。
- 设置连接的方法
醇>setConnection
再次错了。它应该是返回新连接的方法getConnection()
。
- 检查连接是否处于活动状态的方法checkConnection,如果不是,则调用setConnection方法建立新连接
醇>
再次错了。甚至不应该存在这种方法。这是连接池的工作。
- 一个调用checkConnection的按钮,如果返回的布尔值为true,则执行查询
醇>
再次错了。它应该是一个按钮:
getConnection()
Connection.createStatement()
或Connection.prepareStatement()
ResultSet
,并填充用结果行填充的任何内容。