


package day02;import java.sql.Connection;import java.sql.PReparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import org.junit.Test;import smis.unit.JdbcUnit;public class SwTest { @Test public void testNoSW() throws Exception { // 查詢是否有錢 String sql = "SELECT * FROM account WHERE name = ? and balance >= ?"; Connection conn = JdbcUnit.getConn(); PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, "張無(wú)忌"); ps.setInt(2, 1000); ResultSet rs = ps.executeQuery(); if (!rs.next()) { throw new RuntimeException("親,你的余額不足!"); } // 扣除張無(wú)忌的1000 sql = "UPDATE account SET balance = balance - ? WHERE name = ?"; ps = conn.prepareStatement(sql); ps.setInt(1, 1000); ps.setString(2, "張無(wú)忌"); ps.executeUpdate(); // 趙敏增加1000 sql = "UPDATE account SET balance = balance + ? WHERE name = ?"; ps = conn.prepareStatement(sql); ps.setInt(1, 1000); ps.setString(2, "趙敏"); ps.executeUpdate(); JdbcUnit.close(conn, ps, rs); } @Test public void testSW() { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { // 查詢是否有錢 String sql = "SELECT * FROM account WHERE name = ? and balance >= ?"; conn = JdbcUnit.getConn(); //取消事務(wù)的自動(dòng)提交 conn.setAutoCommit(false); ps = conn.prepareStatement(sql); ps.setString(1, "張無(wú)忌"); ps.setInt(2, 1000); rs = ps.executeQuery(); if (!rs.next()) { throw new RuntimeException("親,你的余額不足!"); } // 扣除張無(wú)忌的1000 sql = "UPDATE account SET balance = balance - ? WHERE name = ?"; ps = conn.prepareStatement(sql); ps.setInt(1, 1000); ps.setString(2, "張無(wú)忌"); ps.executeUpdate(); // 趙敏增加1000 sql = "UPDATE account SET balance = balance + ? WHERE name = ?"; ps = conn.prepareStatement(sql); ps.setInt(1, 1000); ps.setString(2, "趙敏"); ps.executeUpdate(); //提交事務(wù) conn.commit(); } catch (Exception e) { e.printStackTrace(); try { //回滾事務(wù) conn.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } finally { JdbcUnit.close(conn, ps, rs); } }}批處理操作
package day02._02_batch;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.Statement;import org.junit.Test;import smis.unit.JdbcUnit;public class BatchTest { /** * @param args */ @Test //InnoDB 4443 //MyISAM 1220 public void testInsertByStatementBatch() throws Exception{ Connection conn = JdbcUnit.getConn(); Statement st = conn.createStatement(); long begin = System.currentTimeMillis(); for(int i=1;i<=1000;i++){ String sql = "INSERT INTO t_student (age) VALUES ("+i+")"; st.addBatch(sql); if(i%200==0){ st.executeBatch();//執(zhí)行批量語(yǔ)句 st.clearBatch();//清理批處理中的緩存 } } System.out.println(System.currentTimeMillis() - begin); JdbcUnit.close(conn, st, null); } //InnoDB 5308 //MyISAM 2570 public static void main(String[] args) throws Exception { String sql = "INSERT INTO t_student (age) VALUES (?)"; Connection conn = JdbcUnit.getConn(); PreparedStatement ps = conn.prepareStatement(sql); long begin = System.currentTimeMillis(); for(int i =0;i<=1000;i++){ ps.setInt(1, i); ps.addBatch(); if(i%200 == 0){ ps.executeBatch(); ps.clearBatch(); ps.clearParameters(); // 這里和上面的Statement不一樣,需要清理參數(shù) } } System.out.println(System.currentTimeMillis() - begin); JdbcUnit.close(conn, ps, null); } }不知道為什么使用PreparedStatement Junit不行,于是乎直接main吧!
獲取自動(dòng)生成的主鍵
在注冊(cè)頁(yè)面的時(shí)候,一開始只需要賬戶和密碼,點(diǎn)擊注冊(cè)后會(huì)讓你更新資料,這個(gè)時(shí)候就需要獲取自動(dòng)生成的主鍵了
連接池思想
為什么必須使用數(shù)據(jù)庫(kù)連接池:
普通的JDBC數(shù)據(jù)庫(kù)連接(Connectiond對(duì)象)使用 DriverManager來(lái)獲取,每次向數(shù)據(jù)庫(kù)建立連接的時(shí)候都要將 Connection 加載到內(nèi)存中,再驗(yàn)證用戶名和密碼(得花費(fèi)0.05s~1s的時(shí)間),數(shù)據(jù)庫(kù)的連接是比較昂貴的(創(chuàng)建的成本比較大)。
需要數(shù)據(jù)庫(kù)連接的時(shí)候,就向數(shù)據(jù)庫(kù)要求一個(gè),執(zhí)行完成后再斷開連接。這樣的方式將會(huì)消耗大量的資源和時(shí)間。
數(shù)據(jù)庫(kù)的連接資源并沒有得到很好的重復(fù)利用.若同時(shí)有幾百人甚至幾千人在線,頻繁的進(jìn)行數(shù)據(jù)庫(kù)連接操作將占用很多的系統(tǒng)資源,嚴(yán)重的甚至?xí)斐煞?wù)器的崩潰
dbcp連接池
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注