JDBC API

取得连接

加载驱动

 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

取得连接

 Connection con = DriverManager.getConnection("jdbc:odbc:somedb","user","passwd");

JDBC URL表明与1个指定驱动程式方式下的独立数据库。

执行SQL

获取java.sql.Statement类

  Statement stmt = con.createStatement();
  ResultSet rs = stmt.executeQuery("SELECT * FROM CUSTOMERS");

事务处理

事务处理在完成之前都是与数据库其他部分隔离。这意味着其他访问用户总是会看到一个有效数据,但不一定是最新的。

使用带有JDBC的事务处理

可以调用Connection对象的setAutoCommit(false),一旦完成了所有语句,就调用commit()永久提交。
举个例子

import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class OrderHandler extends HttpServlet {

  public void doPost(HttpServletRequest req, HttpServletResponse res)
                                throws ServletException, IOException {
    res.setContentType("text/plain");
    PrintWriter out = res.getWriter();

    Connection con = null;
    try {
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
      con = DriverManager.getConnection("jdbc:odbc:ordersdb", "user", "passwd");

      // Turn on transactions
      con.setAutoCommit(false);

      Statement stmt = con.createStatement();
      stmt.executeUpdate(
        "UPDATE INVENTORY SET STOCK = (STOCK - 10) WHERE PRODUCTID = 7");
      stmt.executeUpdate(
        "UPDATE SHIPPING SET SHIPPED = (SHIPPED + 10) WHERE PRODUCTID = 7");

      chargeCard();  // method doesn't actually exist...

      con.commit();
      out.println("Order successful!  Thanks for your business!");
    }
    catch (Exception e) {
      // Any error is grounds for rollback
      try {
        con.rollback();
      }
      catch (SQLException ignored) { }
      out.println("Order failed. Please contact technical support.");
    }
    finally {
      // Clean up.
      try {
        if (con != null) con.close();
      }
      catch (SQLException ignored) { }
    }
  }
}

优化事务处理进程

注意到上文的Connection对象在doPost()方法中构造,放弃了通过将构造移到init()方法中的增强性能效果。这样做是因为事务处理被链接到了连接上,因此使用事务处理的连接不能被共享。如果这个servlet的另一个调用在我们的订单只运行到了第二天SQL语句时调用了commit(),那就完蛋了。
那么如何在每次网页请求时不连接到数据库而使用事物处理呢?有几个方案:
1. 同步doPost()方法。意味着每个servlet实例每次只处理一个请求。
2. 不改变所有的事情。只为每次的事务处理生成一个新的Connection对象。当然这个完全不可取。。。。。。
3. 在init()方法中生成一个Connection对象池。这个方法可能会是最有效的。
4. 在servlet中实现会话跟踪并使用HttpoSession对象来为每个用户保持一个Connection。可以在多个网页请求和多个servlet中完成事务。

连接池

通过一个连接池,我们可以只复制需要复制的资源(是Connection对象)。一个连接池还能智能地管理池的大小,并使得每个连接可用。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐