JDBC 進(jìn)階——連接池

本文包括

  1. 傳統(tǒng)JDBC的缺點(diǎn)

  2. 連接池原理

  3. 自定義連接池

  4. 開源數(shù)據(jù)庫連接池

  5. DBCP連接池

  6. C3P0連接池

  7. Tomcat內(nèi)置連接池

1黑界、傳統(tǒng)JDBC的缺點(diǎn)

  • 用戶每次請(qǐng)求都需要向數(shù)據(jù)庫獲得鏈接,而數(shù)據(jù)庫創(chuàng)建連接通常需要消耗相對(duì)較大的資源锻全,創(chuàng)建時(shí)間也較長。

  • 假設(shè)網(wǎng)站一天10萬訪問量绪氛,數(shù)據(jù)庫服務(wù)器就需要?jiǎng)?chuàng)建10萬次連接揍鸟,極大的浪費(fèi)數(shù)據(jù)庫的資源楞黄,并且極易造成數(shù)據(jù)庫服務(wù)器內(nèi)存溢出池凄、拓機(jī)。

2谅辣、連接池原理

  • 在服務(wù)器端一次性創(chuàng)建多個(gè)連接修赞,將多個(gè)連接保存在一個(gè)連接池對(duì)象中,當(dāng)應(yīng)用程序的請(qǐng)求需要操作數(shù)據(jù)庫時(shí)桑阶,不會(huì)為請(qǐng)求創(chuàng)建新的連接柏副,而是直接從連接池中獲得一個(gè)連接,操作數(shù)據(jù)庫結(jié)束之后蚣录,并不需要真正關(guān)閉連接割择,而是將連接放回到連接池中。

  • 節(jié)省創(chuàng)建連接萎河、釋放連接 資源

3荔泳、自定義連接池

  • 編寫連接池需實(shí)現(xiàn)javax.sql.DataSource接口。DataSource接口中定義了兩個(gè)重載的getConnection方法:

      Connection.getConnection() 
    
      Connection.getConnection(String username, String password) 
    
  • 自定義一個(gè)類虐杯,實(shí)現(xiàn)DataSource接口玛歌,并實(shí)現(xiàn)連接池功能的步驟:

    • 在自定義類的構(gòu)造函數(shù)中批量創(chuàng)建Connection,并把創(chuàng)建的連接保存到一個(gè)集合對(duì)象中(LinkedList)擎椰。

    • 在自定義類中實(shí)現(xiàn)Connection.getConnection方法支子,讓getConnection方法每次調(diào)用時(shí),從集合對(duì)象中取出一個(gè)Connection返回給用戶达舒。

    • 當(dāng)用戶使用完Connection值朋,不能調(diào)用Connection.close()方法,而要使用連接池提供關(guān)閉方法巩搏,即將Connection放回到連接池之中(把Connection存入集合對(duì)象中)昨登。

      Connection對(duì)象應(yīng)保證將自己返回到連接池的集合對(duì)象中,而不要把Connection還給數(shù)據(jù)庫贯底。

    • 如果用戶習(xí)慣調(diào)用Connection.close()方法丰辣,則可以使用動(dòng)態(tài)代理來增強(qiáng)原有方法。

  • demo:

      public class MyDataSource implements DataSource {
      
          // 鏈表 --- 實(shí)現(xiàn) 棧結(jié)構(gòu) 禽捆、隊(duì)列 結(jié)構(gòu)
          private LinkedList<Connection> dataSources = new LinkedList<Connection>();
      
          public MyDataSource() {
              // 一次性創(chuàng)建10個(gè)連接
              for (int i = 0; i < 10; i++) {
                  try {
                      Connection conn = JDBCUtils.getConnection();
                      // 將連接加入連接池中
                      dataSources.add(conn);
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
              }
          }
      
          @Override
          public Connection getConnection() throws SQLException {
              // 取出連接池中一個(gè)連接
              final Connection conn = dataSources.removeFirst(); // 刪除第一個(gè)連接返回
              System.out.println("取出一個(gè)連接剩余 " + dataSources.size() + "個(gè)連接笙什!");
              // 將目標(biāo)Connection對(duì)象進(jìn)行增強(qiáng)
              Connection connProxy = (Connection) Proxy.newProxyInstance(conn
                      .getClass().getClassLoader(), conn.getClass().getInterfaces(),
                      new InvocationHandler() {
                          // 執(zhí)行代理對(duì)象任何方法 都將執(zhí)行 invoke
                          @Override
                          public Object invoke(Object proxy, Method method,
                                  Object[] args) throws Throwable {
                              if (method.getName().equals("close")) {
                                  // 需要加強(qiáng)的方法
                                  // 不將連接真正關(guān)閉,將連接放回連接池
                                  releaseConnection(conn);
                                  return null;
                              } else {
                                  // 不需要加強(qiáng)的方法
                                  return method.invoke(conn, args); // 調(diào)用真實(shí)對(duì)象方法
                              }
                          }
                      });
              return connProxy;
          }
      
          // 將連接放回連接池
          public void releaseConnection(Connection conn) {
              dataSources.add(conn);
              System.out.println("將連接 放回到連接池中 數(shù)量:" + dataSources.size());
          }
      
          @Override
          public Connection getConnection(String username, String password)
                  throws SQLException {
              return null;
          }
      
          @Override
          public PrintWriter getLogWriter() throws SQLException {
              // TODO Auto-generated method stub
              return null;
          }
      
          @Override
          public int getLoginTimeout() throws SQLException {
              // TODO Auto-generated method stub
              return 0;
          }
      
          @Override
          public void setLogWriter(PrintWriter out) throws SQLException {
              // TODO Auto-generated method stub
      
          }
      
          @Override
          public void setLoginTimeout(int seconds) throws SQLException {
              // TODO Auto-generated method stub
      
          }
      
          @Override
          public boolean isWrapperFor(Class<?> iface) throws SQLException {
              // TODO Auto-generated method stub
              return false;
          }
      
          @Override
          public <T> T unwrap(Class<T> iface) throws SQLException {
              // TODO Auto-generated method stub
              return null;
          }
      
      }
    

4睦擂、開源數(shù)據(jù)庫連接池

  • 現(xiàn)在很多WEB服務(wù)器(Weblogic, WebSphere, Tomcat)都提供了DataSoruce的實(shí)現(xiàn),即連接池的實(shí)現(xiàn)杖玲。通常我們把DataSource的實(shí)現(xiàn)顿仇,按其英文含義稱之為數(shù)據(jù)源,數(shù)據(jù)源中都包含了數(shù)據(jù)庫連接池的實(shí)現(xiàn)。

  • 也有一些開源組織提供了數(shù)據(jù)源的獨(dú)立實(shí)現(xiàn):

    • Apache commons-dbcp 數(shù)據(jù)庫連接池

    • C3P0 數(shù)據(jù)庫連接池

    • Apache Tomcat內(nèi)置的連接池(apache dbcp)

  • 實(shí)際應(yīng)用時(shí)不需要編寫連接數(shù)據(jù)庫代碼臼闻,直接從數(shù)據(jù)源獲得數(shù)據(jù)庫的連接鸿吆。程序員編程時(shí)也應(yīng)盡量使用這些數(shù)據(jù)源的實(shí)現(xiàn),以提升程序的數(shù)據(jù)庫訪問性能述呐。

  • 原來由jdbcUtil創(chuàng)建連接惩淳,現(xiàn)在由dataSource創(chuàng)建連接,為實(shí)現(xiàn)不和具體數(shù)據(jù)綁定乓搬,因此datasource也應(yīng)采用配置文件的方法獲得連接思犁。

  • 在Apache官網(wǎng)下載時(shí),注意這些開源連接池的版本进肯,要與本地JDK與JDBC版本對(duì)應(yīng)激蹲!

    比如說:Apache Commons DBCP 2.1.1 for JDBC 4.1 (Java 7.0+)

    我在MyEclipse創(chuàng)建工程時(shí)設(shè)置JAVASE-1.6,而現(xiàn)在最新的DBCP版本為2.1.1江掩,它要求的是Java 7.0+学辱,所以在import相關(guān)包時(shí),會(huì)報(bào)錯(cuò)环形,提示需要configure build path策泣。

    解決方法:下載低版本的兩個(gè)jar包即可。

5抬吟、DBCP連接池

  • DBCP 是 Apache 軟件基金組織下的開源連接池實(shí)現(xiàn)萨咕,使用DBCP連接池,需要在build path中增加如下兩個(gè) jar 文件:

    • Commons-dbcp.jar:連接池的實(shí)現(xiàn)

    • Commons-pool.jar:連接池實(shí)現(xiàn)的依賴庫

  • Tomcat 的連接池正是采用該連接池來實(shí)現(xiàn)的拗军。該數(shù)據(jù)庫連接池既可以與應(yīng)用服務(wù)器整合使用任洞,也可由應(yīng)用程序獨(dú)立使用。

  • 使用DBCP連接池发侵,需要有driverclass交掏、url、username刃鳄、password盅弛,有兩種方法配置:

    • 使用BasicDataSource.setXXX(XXX)方法手動(dòng)設(shè)置四個(gè)參數(shù)

        @Test
        public void demo1() throws SQLException {
            // 使用BasicDataSource 創(chuàng)建連接池
            BasicDataSource basicDataSource = new BasicDataSource();
            // 創(chuàng)建連接池 一次性創(chuàng)建多個(gè)連接池
      
            // 連接池 創(chuàng)建連接 ---需要四個(gè)參數(shù)
            basicDataSource.setDriverClassName("com.mysql.jdbc.Driver");
            basicDataSource.setUrl("jdbc:mysql:///day14");
            basicDataSource.setUsername("root");
            basicDataSource.setPassword("123");
      
            // 從連接池中獲取連接
            Connection conn = basicDataSource.getConnection();
            String sql = "select * from account";
            PreparedStatement stmt = conn.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();
      
            while (rs.next()) {
                System.out.println(rs.getString("name"));
            }
      
            JDBCUtils.release(rs, stmt, conn);
        }
      
    • 編寫properties配置文件,在測試代碼中創(chuàng)建Properties對(duì)象加載文件

      dbcp.properties文件:

        driverClassName=com.mysql.jdbc.Driver
        url=jdbc:mysql:///day14
        username=root
        password=123
      

      測試代碼:

        @Test
        public void demo2() throws Exception {
            // 讀取dbcp.properties ---- Properties
            Properties properties = new Properties();
            properties.load(new FileInputStream(this.getClass().getResource(
                    "/dbcp.properties").getFile()));
      
            DataSource basicDataSource = BasicDataSourceFactory
                    .createDataSource(properties);
      
            // 從連接池中獲取連接
            Connection conn = basicDataSource.getConnection();
            String sql = "select * from account";
            PreparedStatement stmt = conn.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();
      
            while (rs.next()) {
                System.out.println(rs.getString("name"));
            }
      
            JDBCUtils.release(rs, stmt, conn);
      
        }
      

6叔锐、C3P0連接池

  • 使用C3P0連接池挪鹏,需要在build path中添加一個(gè)jar包:c3p0-版本號(hào).jar

  • Basic Pool Configuration 基本屬性

    • acquireIncrement 當(dāng)連接池連接用完了,根據(jù)該屬性決定一次性新建多少連接

    • initialPoolSize 初始化一次性創(chuàng)建多少個(gè)連接

    • maxPoolSize 最大連接數(shù)

    • maxIdleTime 最大空閑時(shí)間愉烙,當(dāng)連接池中連接經(jīng)過一段時(shí)間沒有使用讨盒,根據(jù)該數(shù)據(jù)進(jìn)行釋放

      maxIdleTime

      Default: 0

      Seconds a Connection can remain pooled but unused before being discarded. Zero means idle connections never expire. [See "Basic Pool Configuration"]

    • minPoolSize 最小連接池尺寸
      
    • 總而言之:當(dāng)創(chuàng)建連接池時(shí),一次性創(chuàng)建initialPoolSize 個(gè)連接步责,當(dāng)連接使用完一次性創(chuàng)建 acquireIncrement 個(gè)連接返顺,連接最大數(shù)量 maxPoolSize 禀苦,當(dāng)連接池連接數(shù)量大于 minPoolSize ,經(jīng)過maxIdleTime 連接沒有使用遂鹊, 該連接將被釋放振乏。

  • 使用C3P0連接池,同樣有兩種方法配置

    • 手動(dòng)配置(除了設(shè)置四個(gè)必須的參數(shù)秉扑,還可以設(shè)置Basic Pool Configuration)

        @Test
        public void demo1() throws Exception {
            // 創(chuàng)建一個(gè)連接池
            ComboPooledDataSource dataSource = new ComboPooledDataSource();
            // 手動(dòng)設(shè)置四個(gè)參數(shù)
            dataSource.setDriverClass("com.mysql.jdbc.Driver");
            dataSource.setJdbcUrl("jdbc:mysql:///day14");
            dataSource.setUser("root");
            dataSource.setPassword("123");
      
            //dataSource.setMaxPoolSize(40); // 手動(dòng)設(shè)置Basic Pool Configuration
      
            Connection conn = dataSource.getConnection();
            String sql = "select * from account";
            PreparedStatement stmt = conn.prepareStatement(sql);
      
            ResultSet rs = stmt.executeQuery();
      
            while (rs.next()) {
                System.out.println(rs.getString("name"));
            }
      
            JDBCUtils.release(rs, stmt, conn);
        }
      
    • 使用c3p0-config.xml配置:

      c3p0-config.xml文件:

        <?xml version="1.0" encoding="UTF-8"?>
        <c3p0-config>
            <default-config> <!-- 默認(rèn)配置 -->
                <property name="driverClass">com.mysql.jdbc.Driver</property>
                <property name="jdbcUrl">jdbc:mysql:///day14</property>
                <property name="user">root</property>
                <property name="password">123</property>
                
                <property name="acquireIncrement">10</property>
                <property name="initialPoolSize">10</property>
                <property name="maxPoolSize">100</property>
                <property name="maxIdleTime">60</property>
                <property name="minPoolSize">5</property>
            </default-config>
            <named-config name="itcast">   <!-- 自定義配置 -->
                <property name="driverClass">com.mysql.jdbc.Driver</property>
                <property name="jdbcUrl">jdbc:mysql:///day14</property>
                <property name="user">root</property>
                <property name="password">123</property>
                
                <property name="acquireIncrement">10</property>
                <property name="initialPoolSize">10</property>
                <property name="maxPoolSize">100</property>
                <property name="maxIdleTime">60</property>
                <property name="minPoolSize">5</property>
            </named-config>
        </c3p0-config>
      

      測試代碼:

        @Test
        public void demo2() throws SQLException {
            // 使用c3p0配置文件
            // 自動(dòng)加載src/c3p0-config.xml慧邮,不需要像前文的dbcpconfig.properties那樣加載配置文件!
        
            // ComboPooledDataSource dataSource = new ComboPooledDataSource(); // 使用默認(rèn)配置
            ComboPooledDataSource dataSource = new ComboPooledDataSource("itcast"); // 使用自定義配置
      
            Connection conn = dataSource.getConnection();
            String sql = "select * from account";
            PreparedStatement stmt = conn.prepareStatement(sql);
      
            ResultSet rs = stmt.executeQuery();
      
            while (rs.next()) {
                System.out.println(rs.getString("name"));
            }
      
            JDBCUtils.release(rs, stmt, conn);
        }
      

7舟陆、Tomcat內(nèi)置連接池

  • 因?yàn)門omcat和 dbcp 都是Apache公司項(xiàng)目误澳,Tomcat內(nèi)部連接池就是dbcp。

  • Tomcat支持Servlet吨娜、JSP等脓匿,類似于容器,但并不支持所有JavaEE規(guī)范宦赠,JNDI就是JavaEE規(guī)范之一陪毡。

  • 開發(fā)者通過JNDI方式可以訪問Tomcat內(nèi)置連接池。

使用Tomcat內(nèi)置連接池的前提

  • 將web工程部署到Tomcat三種方式: 配置server.xml <Context> 元素勾扭、配置獨(dú)立xml文件 <Context> 元素 毡琉、直接將網(wǎng)站目錄復(fù)制Tomcat/webapps
    虛擬目錄 ---- <Context> 元素

  • 若想使用Tomcat內(nèi)置連接池,必須要在Context元素中添加Resource標(biāo)簽妙色,具體代碼如下:

      <Context>
          <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
                     maxActive="100" maxIdle="30" maxWait="10000"
                     username="root" password="123" driverClassName="com.mysql.jdbc.Driver"
                     url="jdbc:mysql://localhost:3306/day14"/>
      </Context>
    
  • 在哪里配置元素桅滋?有三個(gè)位置可以配置:

    1. tomcat安裝目錄/conf/context.xml --------- 對(duì)當(dāng)前Tomcat內(nèi)部所有虛擬主機(jī)中任何工程都有效

    2. tomcat安裝目錄/conf/Catalina/虛擬主機(jī)目錄/context.xml -------- 對(duì)當(dāng)前虛擬主機(jī)任何工程都有效

    3. 在web工程根目錄/META-INF/context.xml ------- 對(duì)當(dāng)前工程有效 (常用!)

      具體做法:MyEclipse中身辨,在項(xiàng)目根目錄的WebRoot/META-INF中丐谋,新建context.xml文件,配置代碼如下:

       <?xml version="1.0" encoding="UTF-8"?>
       <!-- tomcat啟動(dòng)時(shí)煌珊,加載該配置文件号俐,創(chuàng)建連接池,將連接池保存tomcat容器中 -->
       <Context>
       <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
                      maxActive="100" maxIdle="30" maxWait="10000"
                      username="root" password="123" driverClassName="com.mysql.jdbc.Driver"
                      url="jdbc:mysql://localhost:3306/day14"/>
       </Context>
      

JNDI技術(shù)簡介

  • JNDI(Java Naming and Directory Interface)定庵,Java命名和目錄接口吏饿,它對(duì)應(yīng)于J2SE中的javax.naming包,

  • 這套API的主要作用在于:它可以把Java對(duì)象放在一個(gè)容器中(支持JNDI容器 Tomcat)蔬浙,并為容器中的java對(duì)象取一個(gè)名稱猪落,以后程序想獲得Java對(duì)象,只需通過名稱檢索即可畴博。

  • 其核心API為Context笨忌,它代表JNDI容器,其lookup方法為檢索容器中對(duì)應(yīng)名稱的對(duì)象俱病。

使用JNDI訪問Tomcat內(nèi)置連接池

  1. 將數(shù)據(jù)庫驅(qū)動(dòng)的jar包復(fù)制到Tomcat安裝目錄/lib中官疲,這樣Tomcat服務(wù)器才能找到數(shù)據(jù)庫驅(qū)動(dòng)杂曲。

  2. 編寫訪問JNDI程序,運(yùn)行在Tomcat內(nèi)部袁余,所以通常是運(yùn)行在Servlet、JSP中咱揍。

  3. 在Tomcat啟動(dòng)時(shí)颖榜,自動(dòng)加載配置文件(context.xml),創(chuàng)建數(shù)據(jù)庫連接池煤裙,該連接池由Tomcat管理掩完。

JNDI原理.jpg
  1. demo:

     public class TomcatServlet extends HttpServlet {
     
         public void doGet(HttpServletRequest request, HttpServletResponse response)
                 throws ServletException, IOException {
             try {
                 // 創(chuàng)建檢索對(duì)象
                 Context initCtx = new InitialContext();
                 // 默認(rèn)查找頂級(jí)java,名稱串固定:java:comp/env
                 Context envCtx = (Context) initCtx.lookup("java:comp/env");
                 // 根據(jù)設(shè)置的名稱查找連接池對(duì)象
                 DataSource ds = (DataSource) envCtx.lookup("jdbc/TestDB");
     
                 // 獲得連接池中一個(gè)連接硼砰,接下來的代碼和連接池?zé)o關(guān)
                 Connection conn = ds.getConnection();
                 String sql = "select * from account";
                 PreparedStatement stmt = conn.prepareStatement(sql);
                 ResultSet rs = stmt.executeQuery();
     
                 while (rs.next()) {
                     System.out.println(rs.getString("name"));
                 }
     
                 JDBCUtils.release(rs, stmt, conn);
             } catch (NamingException e) {
                 e.printStackTrace();
             } catch (SQLException e) {
                 e.printStackTrace();
             }
     
         }
     
         public void doPost(HttpServletRequest request, HttpServletResponse response)
                 throws ServletException, IOException {
             doGet(request, response);
         }
     
     }
    

JDBC文集:

  1. Java 與數(shù)據(jù)庫的橋梁——JDBC:http://www.reibang.com/p/c0acbd18794c

  2. JDBC 進(jìn)階——連接池:http://www.reibang.com/p/ad0ff2961597

  3. JDBC 進(jìn)階——元數(shù)據(jù):http://www.reibang.com/p/36d5d76342f1

  4. JDBC框架——DBUtils:http://www.reibang.com/p/10241754cdd7

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末且蓬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子题翰,更是在濱河造成了極大的恐慌恶阴,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豹障,死亡現(xiàn)場離奇詭異冯事,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)血公,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門昵仅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人累魔,你說我怎么就攤上這事摔笤。” “怎么了垦写?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵吕世,是天一觀的道長。 經(jīng)常有香客問我梯澜,道長寞冯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任晚伙,我火速辦了婚禮吮龄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咆疗。我一直安慰自己漓帚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布午磁。 她就那樣靜靜地躺著尝抖,像睡著了一般毡们。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昧辽,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天衙熔,我揣著相機(jī)與錄音,去河邊找鬼搅荞。 笑死红氯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咕痛。 我是一名探鬼主播痢甘,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼茉贡!你這毒婦竟也來了塞栅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤腔丧,失蹤者是張志新(化名)和其女友劉穎放椰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愉粤,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庄敛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了科汗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片藻烤。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖头滔,靈堂內(nèi)的尸體忽然破棺而出怖亭,到底是詐尸還是另有隱情,我是刑警寧澤坤检,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布兴猩,位于F島的核電站,受9級(jí)特大地震影響早歇,放射性物質(zhì)發(fā)生泄漏倾芝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一箭跳、第九天 我趴在偏房一處隱蔽的房頂上張望晨另。 院中可真熱鬧,春花似錦谱姓、人聲如沸借尿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽路翻。三九已至狈癞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茂契,已是汗流浹背蝶桶。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掉冶,地道東北人莫瞬。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像郭蕉,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喂江,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 本人的環(huán)境為Myeclipse10召锈、MySQL5.7.15 本文包括:簡介JDBC編程步驟打通數(shù)據(jù)庫程序詳解—Dr...
    廖少少閱讀 3,946評(píng)論 7 39
  • JDBC概述 在Java中,數(shù)據(jù)庫存取技術(shù)可分為如下幾類:JDBC直接訪問數(shù)據(jù)庫获询、JDO技術(shù)涨岁、第三方O/R工具,如...
    usopp閱讀 3,539評(píng)論 3 75
  • JDBC簡介 SUN公司為了簡化吉嚣、統(tǒng)一對(duì)數(shù)據(jù)庫的操作梢薪,定義了一套Java操作數(shù)據(jù)庫的規(guī)范,稱之為JDBC尝哆。JDBC...
    奮斗的老王閱讀 1,518評(píng)論 0 51
  • 一秉撇、事務(wù) 事務(wù)就是一個(gè)事情,組成這個(gè)事情可能有多個(gè)單元秋泄,要求這些單元琐馆,要么全都成功,要么全都不成功恒序。在開發(fā)中瘦麸,有事...
    野狗子嗷嗷嗷閱讀 2,805評(píng)論 0 6
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,811評(píng)論 0 11