⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 17.html

📁 写给JSP初级程序员的书
💻 HTML
📖 第 1 页 / 共 2 页
字号:
              <TR>
                <TD>user</TD>
                <TD>String</TD>
                <TD>用户登录名。</TD></TR></TBODY><P class=content>在javax.sql.DataSource接口中定义了以下方法:</P>
            
              <table><tbody>
              <TR>
                <TD bgColor=#e6e6e6 class=code><B>* public synchronized void 
                  setDatabaseName(String dbname)<BR>* public synchronized String 
                  getDatabaseName()<BR>* public synchronized void 
                  setDataSourceName(String dsname)<BR>* public synchronized 
                  String getDataSourceName()<BR>* public synchronized void 
                  setDescription(String desc)<BR>* public synchronized String 
                  getDescription()<BR>* public synchronized void 
                  setNetworkProtocol(String np)<BR>* public synchronized String 
                  getNetworkProtocol()<BR>* public synchronized void 
                  setPassword(String pwd)<BR>* public synchronized void 
                  setPortNumber(int pn)<BR>* public synchronized int 
                  getPortNumber()<BR>* public synchronized void 
                  setServerName(String sn)<BR>* public synchronized String 
                  getServerName()<BR>* public synchronized void setUser(String 
                  user)<BR>* public synchronized String getUser() 
              </B></TD></TR></TBODY><P 
            class=content>通过这些方法,程序员可以获得建立连接需要的所有信息。需要注意的是,程序员不可以获取登陆密码,这就在一定程度上保证了安全性。需要注意的另一点是所有的方法都是synchronized方法,这是为了保证应用程序的线程安全(Thread-safe)。如果在调用该方法时,即使数据源实例发生变化不会影响程序的正确运行。</P>
            <P class=content>除了实现由SUN定义的属性和方法外,<A 
            Oracle</A>8i还提供了自己的数据源属性和方法。这些方法和属性是在oracle.jdbc.pool.<A 
            Oracle</A>DataSource中实现的。 
            <A 
            Oracle</A>8i扩展数据源属性如表二所示:</P>
            <P class=content>表二:</P>
            
              <table><tbody>
              <TR bgColor=#e9e9e9>
                <TD>属性名称</TD>
                <TD>属性数据类型</TD>
                <TD>描述</TD></TR>
              <TR>
                <TD>driverType</TD>
                <TD>String</TD>
                <TD>使用的<A 
                  Oracle</A> 
                  JDBC驱动程序的类型,包括oci8, thin和kprb</TD></TR>
              <TR>
                <TD>url</TD>
                <TD>String</TD>
                <TD>数据库连接的URL。</TD></TR>
              <TR>
                <TD>tnsEntry</TD>
                <TD>String</TD>
                <TD>TNS条目名称</TD></TR></TBODY><P class=content>在oracle.jdbc.pool.<A 
            Oracle</A>DataSource中除了实现javax.sql.DataSource接口中定义的方法外,还实现了以下方法:</P>
            
              <table><tbody>
              <TR>
                <TD bgColor=#e6e6e6 class=code><B>* public synchronized void 
                  setDriverType(String dt)<BR>* public synchronized String 
                  getDriverType()<BR>* public synchronized void setURL(String 
                  url)<BR>* public synchronized String getURL()<BR>* public 
                  synchronized void setTNSEntryName(String tns)<BR>* public 
                  synchronized String getTNSEntryName()</B></TD></TR></TBODY><P class=content>同时,<A 
            Oracle</A>DataSource还实现了java.io.Serializable和javax.naming.Referenceable接口。</P>
            <H4>独立使用数据源</H4>
            <P class=content>实际应用中,你可以把<A 
            Oracle</A>DataSource注册到JNDI,也可以单独使用。下面先给出一个单独使用<A 
            Oracle</A>DataSource的例子:</P>
            
              <table><tbody>
              <TR>
                <TD bgColor=#e6e6e6 class=code><B>// 初始化数据源实例<BR><A 
                  Oracle</A>DataSource 
                  ods = new <A 
                  Oracle</A>DataSource();<BR><BR>ods.setDriverType("thin");<BR>ods.setServerName("Chicago");<BR>ods.setNetworkProtocol("tcp");<BR>ods.setDatabaseName("chidb");<BR>ods.setPortNumber(1521);<BR>ods.setUser("guest");<BR>ods.setPassword("guest");<BR><BR>// 
                  从数据源中获取数据库连接<BR>Connection conn = ods.getConnection();<BR>// 
                  通过数据库连接进行数据操作<BR>   ………………</B></TD></TR></TBODY><P class=content>使用<A 
            Oracle</A>DataSource时有几点需要注意:</P>
            <OL>
              <LI>如果使用的时服务器端内部驱动程序(server-side internal 
              driver),driverType属性会被设置为kprb,其它所有属性失效。
              <LI>如果使用Thin或OCI驱动程序:
              <OL type=a>
                <LI>URL中可以包括用户登录名和用户登录密码。例如:<BR>jdbc:oracle:thin:guest/guest@Chicago:1521:chidb;
                <LI>如果设定了url属性,tnsEntry, driverType, portNumber, 
                networkProtocol, serverName,和databaseName属性将失效。
                <LI>在没有设定url属性的情况下,如果设定了tnsEntry属性,portNumber, networkProtocol, 
                serverName,和databaseName属性将失效。
                <LI>如果使用OCI驱动程序,并且networkProtocol属性被设定为ipc,除user和password外的所有其他属性将失效。</LI></OL></LI></OL>
            <H4>通过JNDI使用数据源</H4>
            <P class=content>在本节首先给出了一个实际程序,然后通过程序来讲解如何通过JNDI查询数据源。</P>
            
              <table><tbody>
              <TR>
                <TD bgColor=#e6e6e6 class=code><B>import java.sql.*;<BR>import 
                  javax.sql.*;<BR>import oracle.jdbc.driver.*;<BR>import 
                  oracle.jdbc.pool.<A 
                  Oracle</A>DataSource;<BR>import 
                  javax.naming.*;<BR>import javax.naming.spi.*;<BR>import 
                  java.util.Hashtable;<BR><BR>public class 
                  DataSourceJNDI<BR>{<BR>public static void main (String args 
                  [])<BR>throws SQLException<BR>{<BR>// 初始化名称服务环境<BR>Context ctx 
                  = null;<BR>try<BR>{<BR>Hashtable env = new Hashtable 
                  (5);<BR>env.put 
                  (Context.INITIAL_CONTEXT_FACTORY,<BR>"com.sun.jndi.fscontext.RefFSContextFactory");<BR>env.put 
                  (Context.PROVIDER_URL, "file:JNDI");<BR>ctx = new 
                  InitialContext(env);<BR>}<BR>catch (NamingException 
                  ne)<BR>{<BR>ne.printStackTrace();<BR>}<BR><BR><BR>bind(ctx, 
                  "jdbc/chidb");<BR>lookup(ctx, 
                  "jdbc/chidb");<BR><BR>}<BR><BR>static void bind (Context ctx, 
                  String ln)<BR>throws NamingException, SQLException<BR>{<BR>// 
                  创建一个<A 
                  Oracle</A>DataSource实例<BR><A 
                  Oracle</A>DataSource 
                  ods = new <A 
                  Oracle</A>DataSource();<BR><BR>ods.setDriverType("thin");<BR>ods.setServerName("Chicago");<BR>ods.setNetworkProtocol("tcp");<BR>ods.setDatabaseName("chidb");<BR>ods.setPortNumber(1521);<BR>ods.setUser("guest");<BR>ods.setPassword("guest");<BR><BR><BR>// 
                  把<A 
                  Oracle</A>DataSource实例注册到JNDI中<BR>System.out.println 
                  ("Doing a bind with the logical name : " + ln);<BR>ctx.bind 
                  (ln,ods);<BR>System.out.println ("Successfully 
                  bound");<BR>}<BR><BR>static void lookup (Context ctx, String 
                  ln)<BR>throws NamingException, SQLException<BR>{<BR>// 
                  从JNDI中查询<A 
                  Oracle</A>DataSource实例<BR>System.out.println 
                  ("Doing a lookup with the logical name : " + ln);<BR><A 
                  Oracle</A>DataSource 
                  ods = (<A 
                  Oracle</A>DataSource) 
                  ctx.lookup (ln);<BR>System.out.println ("Successful 
                  lookup");<BR><BR>// 从查询到的<A 
                  Oracle</A>DataSource实例中获取数据库连接<BR>  Connection 
                  conn = ods.getConnection();<BR>  // 
                  进行数据库操作<BR>getUserName(conn);<BR>// 
                  关闭连接<BR>conn.close();<BR>conn = null;<BR>}<BR><BR>static void 
                  getUserName(Connection conn)<BR>throws SQLException<BR>{<BR>// 
                  生成一个Statement实例<BR>Statement stmt = conn.createStatement 
                  ();<BR><BR>// 从addressbook表中选中姓名列<BR>ResultSet rset = 
                  stmt.executeQuery ("select NAME from addressbook");<BR><BR>// 
                  列出addressbook表所有人的姓名<BR>while (rset.next 
                  ())<BR>System.out.println ("Name is " + rset.getString 
                  (1));<BR><BR>// 关闭RseultSet实例<BR>rset.close();<BR>rset = 
                  null;<BR><BR>// 关闭Statement实例<BR>stmt.close();<BR>stmt = 
                  null;<BR>}<BR>}</B></TD></TR></TBODY><P 
            class=content>程序首先生成了一个Context实例。javax.naming.Context接口定义了名称服务环境(Naming 
            Context)及该环境支持的操作。名称服务环境实际上是由名称和对象间的相互映射组成。程序中初始化名称服务环境的环境工厂(Context 
            Factory)是com.sun.jndi.fscontext.RefFSContextFactory(该类在fscontext.jar中可以找到,由于fscontext.jar中包含的不是标准的API,用户需要从www.javasoft.com中的JNDI专区下载一个名为fscontext1_2beta3.zip的压缩文件,在该文件中可以找到fscontext.jar)。环境工厂的作用是生成名称服务环境的实例,javax.naming.spi.InitialContextFactory接口定义了环境工厂应该如何初始化名称服务环境。在初始化名称服务环境时还需要定义环境的URL。程序中使用的是"file:JNDI",也就是把环境保存在本地硬盘的JNDI目录下。</P>
            <P 
            class=content>初始化了名称服务环境后,就可以把数据源实例注册到名称服务环境中。注册时调用javax.naming.Context.bind()方法,参数为注册名称和注册对象。注册成功后,在JNDI目录下会生成一个.binding文件,该文件记录了当前名称服务环境拥有的名称及对象。</P>
            <P 
            class=content>当需要在名称服务环境中查询一个对象时,需要调用javax.naming.Context.lookup()方法,并把查询到的对象显式转化为数据源对象。然后通过该数据源对象进行数据库操作。<BR>在这个例子中,程序和名称服务环境都是在同一台计算机上运行。在实际的应用中,程序可以通过RMI或CORBA向名称服务环境注册或查询对象。例如在一个服务器-客户机结构中,客户机上的应用程序只需要知道数据源对象在服务器名称服务环境中的逻辑名称,就可以通过RMI向服务器查询数据源,然后通过建立与数据库的连接.这样就可以解决本文最开始提出的问题。</P>
        </td>
      </tr>
    </td>
  </tr>
</div>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -