是否可以将数据库连接存储为单独的类,然后从主代码中调用数据库对象?即;
public class main{
public static void main{
try{
Class.forName("com.jdbc.driver");
Database to = new Database(1,"SERVER1","DATABASE");
Database from = new Database(2,"SERVER2","DATABASE");
String QueryStr = String.format("SELECT * FROM TABLE WHERE Id = %i", to.id)
to.results = sql.executeQuery(QueryStr);
while (to.results.next()) {
String QueryStr = String.format("INSERT INTO Table (A,B) VALUES (%s,%s)",to.results.getString(1),to.results.getString(2));
from.sql.executeQuery("QueryStr");
}
to.connection.close()
from.connection.close()
} catch (Exception ex) {
ex.printStackTrace();
{ finally {
if (to.connection != null)
try {
to.connection.close();
} catch (SQLException x) {
}
if (from.connection != null)
try {
from.connection.close();
} catch (SQLException x) {
}
}
}
public static class Database {
public int id;
public String server;
public String database;
public Connection connection;
public ResultSet results;
public Statement sql;
public Database(int _id, String _server, String _database) {
id = _id;
server = _server;
database = _database;
String connectStr = String.format("jdbc:driver://SERVER=%s;port=6322;DATABASE=%s",server,database);
connection = DriverManager.getConnection(connectStr);
sql = connection.createStatement;
}
}
}
当我调用to.results = sql.executeQuery("SELECT * FROM TABLE");
时,我一直收到“连接对象已关闭”错误,就像数据库初始化完成后连接关闭一样。
我问的原因是我有多个数据库与我转储到主数据库中的数据库大致相同。我认为设置一个循环来遍历每个from
数据库并使用相同的类插入每个to
数据库会很好。这不可能吗? Database
也将包含比显示更多的方法。我对java很新,所以希望这很有意义......
另外,我的代码可能会出现语法错误,所以尽量不要关注它。
答案 0 :(得分:1)
连接对象已关闭并不意味着连接已关闭,而是关闭了与连接相关的对象(可能是Statement
或{{1} })。
很难从您的示例中看到,因为它已经被修剪/重新排列,但看起来您可能在重用其相应的ResultSet
之后尝试使用ResultSet
。请参阅documentation:
默认情况下,每个Statement对象只能打开一个ResultSet对象 同时。因此,如果读取一个ResultSet对象是 与另一个的读取交错,每个必须已经生成 通过不同的Statement对象。 Statement中的所有执行方法 如果是,接口隐式关闭一个statment的当前ResultSet对象 打开一个。
答案 1 :(得分:0)
在您的示例中,可能是因为autoCommit默认设置为true。您可以在java.sql.Connection类上覆盖它。更好的是,如果要更新多个表,则使用事务框架。