国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

數(shù)據(jù)源在jdbc中的應(yīng)用(2)

2019-11-18 12:40:06
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  下面具體介紹一下數(shù)據(jù)源和javax.sql.DataSource接口。在數(shù)據(jù)源中存儲(chǔ)了所有建立數(shù)據(jù)庫(kù)連接的信息。就象通過(guò)指定文件名你可以在文件系統(tǒng)中找到文件一樣,通過(guò)提供正確的數(shù)據(jù)源名稱,你可以找到相應(yīng)的數(shù)據(jù)庫(kù)連接。javax.sql.DataSource接口定義了如 何實(shí)現(xiàn)數(shù)據(jù)源。在該接口中定義了九個(gè)屬性。表一列出了對(duì)這些屬性的描述。由于本文是以8i為例,在8i中沒(méi)有實(shí)現(xiàn)roleName屬性,所以在表中沒(méi)有對(duì)此屬性做描述。
  表一:數(shù)據(jù)源標(biāo)準(zhǔn)屬性
  屬性名稱
  屬性數(shù)據(jù)類型 描述
  databaseName String 數(shù)據(jù)庫(kù)名稱,即數(shù)據(jù)庫(kù)的SID。
  dataSourceName String 數(shù)據(jù)源接口實(shí)現(xiàn)類的名稱。
  description String 對(duì)數(shù)據(jù)源的描述。
  networkPRotocol String 和服務(wù)器通訊使用的網(wǎng)絡(luò)協(xié)議名。在8i中,該屬性只在使用OCI驅(qū)動(dòng)程序時(shí)有效,缺省協(xié)議是TCP協(xié)議。
  passWord String 用戶登錄密碼。
  portNumber Int 數(shù)據(jù)庫(kù)服務(wù)器使用的端口,缺省值為1521。
  serverName String 數(shù)據(jù)庫(kù)服務(wù)器名稱。
  user String 用戶登錄名。
  在javax.sql.DataSource接口中定義了以下方法:
  * public synchronized void setDatabaseName(String dbname)
  * public synchronized String getDatabaseName()
  * public synchronized void setDataSourceName(String dsname)
  * public synchronized String getDataSourceName()
  * public synchronized void setDescription(String desc)
  * public synchronized String getDescription()
  * public synchronized void setNetworkProtocol(String np)
  * public synchronized String getNetworkProtocol()
  * public synchronized void setPassword(String pwd)
  * public synchronized void setPortNumber(int pn)
  * public synchronized int getPortNumber()
  * public synchronized void setServerName(String sn)
  * public synchronized String getServerName()
  * public synchronized void setUser(String user)
  * public synchronized String getUser()
  通過(guò)這些方法,程序員可以獲得建立連接需要的所有信息。需要注重的是,程序員不可以獲取登陸密碼,這就在一定程度上保證了安全性。需要注重的另一點(diǎn)是所有的方法都是synchronized方法,這是為了保證應(yīng)用程序的線程安全(Thread-safe)。假如在調(diào)用 該方法時(shí),即使數(shù)據(jù)源實(shí)例發(fā)生變化不會(huì)影響程序的正確運(yùn)行。
  除了實(shí)現(xiàn)由SUN定義的屬性和方法外,8i還提供了自己的數(shù)據(jù)源屬性和方法。這些方法和 屬性是在Oracle.jdbc.pool.DataSource中實(shí)現(xiàn)的。 8i擴(kuò)展數(shù)據(jù)源屬性如表二所示:
  表二:
  屬性名稱 屬性數(shù)據(jù)類型 描述
  driverType String 使用的 JDBC驅(qū)動(dòng)程序的類型,包括oci8, thin和kprb
  url String 數(shù)據(jù)庫(kù)連接的URL。
  tnsEntry String TNS條目名稱
  在oracle.jdbc.pool.DataSource中除了實(shí)現(xiàn)javax.sql.DataSource接口中定義的方法外
  ,還實(shí)現(xiàn)了以下方法:
  * public synchronized void setDriverType(String dt)
  * public synchronized String getDriverType()
  * public synchronized void setURL(String url)
  * public synchronized String getURL()
  * public synchronized void setTNSEntryName(String tns)
  * public synchronized String getTNSEntryName()
  同時(shí),DataSource還實(shí)現(xiàn)了java.io.Serializable和javax.naming.Referenceable接口 。
  獨(dú)立使用數(shù)據(jù)源實(shí)際應(yīng)用中,你可以把DataSource注冊(cè)到JNDI,也可以單獨(dú)使用。下面先給出一個(gè)單獨(dú) 使用DataSource的例子:
  // 初始化數(shù)據(jù)源實(shí)例
  DataSource ods = new DataSource();
  ods.setDriverType("thin");
  ods.setServerName("Chicago");
  ods.setNetworkProtocol("tcp");
  ods.setDatabaseName("chidb");
  ods.setPortNumber(1521);
  ods.setUser("guest");
  ods.setPassword("guest");
  // 從數(shù)據(jù)源中獲取數(shù)據(jù)庫(kù)連接
  Connection conn = ods.getConnection();
  // 通過(guò)數(shù)據(jù)庫(kù)連接進(jìn)行數(shù)據(jù)操作
     ………………
  使用DataSource時(shí)有幾點(diǎn)需要注重:
  假如使用的時(shí)服務(wù)器端內(nèi)部驅(qū)動(dòng)程序(server-side internal driver),driverType屬
  性會(huì)被設(shè)置為kprb,其它所有屬性失效。
  假如使用Thin或OCI驅(qū)動(dòng)程序:
  URL中可以包括用戶登錄名和用戶登錄密碼。例如:
  jdbcracle:thin:guest/guest@Chicago:1521:chidb;
  假如設(shè)定了url屬性,tnsEntry, driverType, portNumber, networkProtocol, server
  Name,和databaseName屬性將失效。
  在沒(méi)有設(shè)定url屬性的情況下,假如設(shè)定了tnsEntry屬性,portNumber, networkProtoc
  ol, serverName,和databaseName屬性將失效。
  假如使用OCI驅(qū)動(dòng)程序,并且networkProtocol屬性被設(shè)定為ipc,除user和password外的
  所有其他屬性將失效。
  通過(guò)JNDI使用數(shù)據(jù)源在本節(jié)首先給出了一個(gè)實(shí)際程序,然后通過(guò)程序來(lái)講解如何通過(guò)JNDI查詢數(shù)據(jù)源。
  import java.sql.*;
  import javax.sql.*;
  import oracle.jdbc.driver.*;
  import oracle.jdbc.pool.DataSource;
  import javax.naming.*;
  import javax.naming.spi.*;
  import java.util.Hashtable;
  public class DataSourceJNDI
  {
  public static void main (String args [])
  throws SQLException
  {
  // 初始化名稱服務(wù)環(huán)境
  Context ctx = null;
  try
  {
  Hashtable env = new Hashtable (5);
  env.put (Context.INITIAL_CONTEXT_FACTORY,
  "com.sun.jndi.fscontext.RefFSContextFactory");
  env.put (Context.PROVIDER_URL, "file:JNDI");
  ctx = new InitialContext(env);
  }
  catch (NamingException ne)
  {
  ne.printStackTrace();
  }
  bind(ctx, "jdbc/chidb");
  lookup(ctx, "jdbc/chidb");
  }
  static void bind (Context ctx, String ln)
  throws NamingException, SQLException
  {
  // 創(chuàng)建一個(gè)DataSource實(shí)例
  DataSource ods = new DataSource();
  ods.setDriverType("thin");
  ods.setServerName("Chicago");
  ods.setNetworkProtocol("tcp");
  ods.setDatabaseName("chidb");
  ods.setPortNumber(1521);
  ods.setUser("guest");
  ods.setPassword("guest");
  // 把DataSource實(shí)例注冊(cè)到JNDI中
  System.out.println ("Doing a bind with the logical name : " + ln);
  ctx.bind (ln,ods);
  System.out.println ("SUCcessfully bound");
  }
  static void lookup (Context ctx, String ln)
  throws NamingException, SQLException
  {
  // 從JNDI中查詢DataSource實(shí)例
  System.out.println ("Doing a lookup with the logical name : " + ln);
  DataSource ods = (DataSource) ctx.lookup (ln);
  System.out.println ("Successful lookup");
  // 從查詢到的DataSource實(shí)例中獲取數(shù)據(jù)庫(kù)連接
    Connection conn = ods.getConnection();
    // 進(jìn)行數(shù)據(jù)庫(kù)操作
  getUserName(conn);
  // 關(guān)閉連接
  conn.close();
  conn = null;
  }
  static void getUserName(Connection conn)
  throws SQLException
  {
  // 生成一個(gè)Statement實(shí)例
  Statement stmt = conn.createStatement ();
  // 從addressbook表中選中姓名列
  ResultSet rset = stmt.executeQuery ("select NAME from addressbook");
  // 列出addressbook表所有人的姓名
  while (rset.next ())
  System.out.println ("Name is " + rset.getString (1));
  // 關(guān)閉RseultSet實(shí)例
  rset.close();
  rset = null;
  // 關(guān)閉Statement實(shí)例
  stmt.close();
  stmt = null;
  stmt = null;
  }
  }
  程序首先生成了一個(gè)Context實(shí)例。javax.naming.Context接口定義了名稱服務(wù)環(huán)境(N aming Context)及該環(huán)境支持的操作。名稱服務(wù)環(huán)境實(shí)際上是由名稱和對(duì)象間的相互映 射組成。程序中初始化名稱服務(wù)環(huán)境的環(huán)境工廠(Context Factory)是com.sun.jndi.
  fscontext.RefFSContextFactory(該類在fscontext.jar中可以找到,由于fscontext.
  jar中包含的不是標(biāo)準(zhǔn)的API,用戶需要從www.javasoft.com中的JNDI專區(qū)下載一個(gè)名為
  fscontext1_2beta3.zip的壓縮文件,在該文件中可以找到fscontext.jar)。環(huán)境工廠的
  作用是生成名稱服務(wù)環(huán)境的實(shí)例,javax.naming.spi.InitialContextFactory接口定義 了環(huán)境工廠應(yīng)該如何初始化名稱服務(wù)環(huán)境。在初始化名稱服務(wù)環(huán)境時(shí)還需要定義環(huán)境的 URL。程序中使用的是"file:JNDI",也就是把環(huán)境保存在本地硬盤(pán)的JNDI目錄下。
  初始化了名稱服務(wù)環(huán)境后,就可以把數(shù)據(jù)源實(shí)例注冊(cè)到名稱服務(wù)環(huán)境中。注冊(cè)時(shí)調(diào)用javax.naming.Context.bind()方法,參數(shù)為注冊(cè)名稱和注冊(cè)對(duì)象。注冊(cè)成功后,在JNDI目 錄下會(huì)生成一個(gè).binding文件,該文件記錄了當(dāng)前名

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 札达县| 龙南县| 九龙县| 崇信县| 朝阳县| 洪雅县| 嘉荫县| 平安县| 永安市| 荣成市| 东方市| 中西区| 连平县| 恩平市| 龙口市| 林西县| 香河县| 陵水| 万源市| 勐海县| 名山县| 茶陵县| 读书| 九寨沟县| 浦江县| 大厂| 鹤峰县| 西畴县| 富民县| 株洲市| 连州市| 昌乐县| 栾城县| 包头市| 剑河县| 娄烦县| 阿拉善右旗| 化德县| 山丹县| 黄龙县| 晋中市|