package classmate;
import java.sql.*;
import javax.sql.DataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class DataStore {
?
?DataSource dataSource = null;
?private static Connection conn = null;
?private Statement stmt = null;
?private boolean hadErrors = false;
?
?//construct
?public DataStore(DataSource dataSource) throws Exception{
??this.dataSource = dataSource;
??conn = dataSource.getConnection();
??stmt = conn.createStatement();
?}
?
?//invoke transaction
?public void beginTransaction() throws SQLException{
??conn.setAutoCommit(false);
?}
?
?//perform transaction
?public void commitTransaction() throws SQLException{
??//hadErrors = false
??if(!hadErrors){
???conn.commit();
??}
??else{? //hadErrors = true
???conn.rollback();
???hadErrors = false;
??}
??hadErrors = false;
??conn.setAutoCommit(true);
?}
?
?//mark error
?public void ErrorOccur(){
??hadErrors = true;
?}
?
?//execute insert,delete,update
?synchronized public void execute(String sql) throws SQLException{
??if(stmt != null)
???stmt.executeUpdate(sql);
??else{
???Log log = LogFactory.getLog("mylog");
???log.error("fail to execute sql");
??}
?}
?
?//execute select
?synchronized public ResultSet read(String sql) throws SQLException{
??if(stmt != null){
???ResultSet tmp = null;
???tmp = stmt.executeQuery(sql);
???return tmp;
??}else{
???return null;
??}
?}
?
?// count of result
?synchronized public int readCount(String sql) throws SQLException{
??int nCount = 0;
??try{
???if(stmt != null){
????ResultSet tmp = null;
????tmp = stmt.executeQuery(sql);
????if(tmp != null && tmp.next()){
?????nCount = tmp.getInt(1);
????}else{
?????nCount = 0;
????}
???}
??}catch(SQLException e){
???nCount = 0;
??}
??return nCount;
?}
?
?// close db
?synchronized public void stop(){
??try{
???if(conn != null){
????conn.close();
????stmt.close();
???}
??}catch(Exception e){
???Log log = LogFactory.getLog("mylog");
???log.error("fail to close db- DataStore.java");
??}finally{
???conn = null;
??}
?}
}
還在研究,貌似DCL的問題還存在。