[英]Java SQLite - how to close connection?
I've seen many examples of closing database connections where people use finally{}
in the DAO method, but in my case the DAO method (ex: insertUsers()) throws its exceptions to the method it's called. 我已经看到了许多关闭数据库连接的示例,人们在DAO方法中使用了
finally{}
,但是在我的情况下,DAO方法(例如:insertUsers())将异常抛出给了它所调用的方法。 In this case, how can i close my connections? 在这种情况下,如何关闭我的连接?
I'm getting the "SQLiteException - Database is locked" error when trying to SELECT
+ INSERT
. 尝试
SELECT
+ INSERT
时出现“ SQLiteException-数据库已锁定”错误。
Here's my code: 这是我的代码:
DAO 道
public static Connection con = null;
private static boolean hasData = false;
private void getConnection() throws ClassNotFoundException, SQLException {
Class.forName("org.sqlite.JDBC");
con = DriverManager.getConnection("jdbc:sqlite:ProjFarmacia.db");
initialise();
}
private void initialise() throws SQLException {
if( !hasData ){
hasData = true;
Statement state = con.createStatement();
ResultSet res = state.executeQuery("SELECT name FROM sqlite_master WHERE type='table' AND name='caixa'");
if(!res.next()){
Statement state2 = con.createStatement();
state2.execute("CREATE TABLE caixa(id integer, timestamp integer, valorTotal double, notas1 integer, notas2 integer,"
+ " notas5 integer, notas10 integer, notas20 integer"
+ "notas50 integer, notas100 integer, moedas1 integer, moedas5 integer, moedas10 integer, moedas25 integer"
+ "moedas50 integer, moedas1R integer, primary key(id));");
}
}
}
public ResultSet getCaixaByDate(long timestamp) throws ClassNotFoundException, SQLException{
if(con == null){
getConnection();
}
Statement state = con.createStatement();
ResultSet res = state.executeQuery("SELECT * FROM caixa WHERE timestamp=" + "'" + timestamp + "'" + ";");
return res;
}
public void createCaixa(Caixa caixa) throws ClassNotFoundException, SQLException{
if(con == null){
getConnection();
}
PreparedStatement prep = con.prepareStatement("INSERT INTO caixa VALUES(?,?);");
prep.setLong(1, caixa.getTimestamp());
prep.setDouble(2, caixa.getValorTotal());
con.close();
}
MAIN APPLICATION 主要应用
try {
ResultSet rs = caixaDAO.getCaixaByDate(timestamp);
//If not exists in database
if(!rs.next()){
Caixa caixa = new Caixa();
caixa.setTimestamp(timestamp);
caixa.setValorTotal(venda.getValorDaVenda());
//Inserting new Caixa
caixaDAO.createCaixa(caixa);
}else{
System.out.println("Caixa already created!!!");
}
} catch (ClassNotFoundException | SQLException ex) {
Logger.getLogger(VendaMedicamento.class.getName()).log(Level.SEVERE, null, ex);
}
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// Do stuff
...
} catch (SQLException ex) {
// Exception handling stuff
...
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) { /* ignored */}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) { /* ignored */}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) { /* ignored */}
}
}
Source: Closing Database Connections in Java 资料来源: 用Java关闭数据库连接
Example of @JaLe29 with Java7-try-with-resources 具有Java7-try-with-resources的@ JaLe29示例
try (Connection conn = DriverManager.getConnection("DB_URL","DB_USER","DB_PASSWORD");
PreparedStatement ps = conn.prepareStatement("SQL");
ResultSet rs = ps.executeQuery()) {
// Do stuff with your ResultSet
} catch (SQLException ex) {
// Exception handling stuff
}
Example of how I would implement a DAO method: 我将如何实现DAO方法的示例:
Caixa getCaixaByDate(long timestamp) {
Caixa result = null;
try(Connection con = getConnection();
PreparedStatement statement = con.prepareStatement("SELECT * FROM caixa WHERE timestamp=?")) {
statement.setLong(1, timestamp);
try (ResultSet res = statement.executeQuery()) {
result = new Caixa();
result.setTimestamp(res.getLong("timestamp")); // this is just an example
//TODO: mapping the other input from the ResultSet into the caixa object
} catch (SQLException e) {
result = null;
Logger.getLogger("MyLogger").log(Level.SEVERE, "error while mapping ResultSet to Caixa: {0}", e.getMessage());
}
} catch (SQLException e) {
Logger.getLogger("MyLogger").log(Level.SEVERE, "error while reading Caixa by date: {0}", e.getMessage());
}
return result;
}
This way your business logic would be this way: 这样,您的业务逻辑将是这样:
public void createCaixaIfNotExist(long timestamp, double valorDaVenda) {
if (caixaDao.getCaixaByDate(timestamp) == null) {
Caixa newCaixa = new Caixa();
newCaixa.setTimestamp(timestamp);
newCaixa.setValorTotal(valorDaVenda);
caixaDao.createCaixa(newCaixa);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.