连接数据库.docx
- 文档编号:30406829
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:28
- 大小:26.83KB
连接数据库.docx
《连接数据库.docx》由会员分享,可在线阅读,更多相关《连接数据库.docx(28页珍藏版)》请在冰豆网上搜索。
连接数据库
javaEE应用中与Oracle数据库的连接
2011-03-3021:
27:
51|分类:
java学习|标签:
oracle数据库连接jdbcimportjava|字号大中小订阅
在J2EE应用程序开发中,应用程序与数据库连接的建立是我们经常遇到的问题之一。
在这里我主要谈谈在本地应用程序中通过OCI方式、thin方式和JdbcOdbc桥方式连接Oracle数据库,在iPlanetApplicationServer6.5和SunJavaSystemApplicationServer7中对Oracle数据库连接池的配置以及应用中如何从连接池中获得连接
一、本地通过JDBC获得Oracle数据库连接
通过JDBC获得Oracle数据库连接,有三种方式:
OCI方式、thin方式和JdbcOdbc桥方式。
OCI方式依赖于本地的动态链接库,如果在本地安装了Oracle数据库客户端可以采用该方式;而thin方式为纯java的数据库连接方式;JdbcOdbc桥方式依赖于本地ODBC数据库源的配置,这种方式一般不太被采用。
1、OCI方式
先在本地安装Oracle客户端,安装完之后,在安装的路径中可以找到…/jdbc/lib/classes12.zip文件,我们在环境变量classpath中设置classes12.zip所在的路径。
然后通过以下的数据库连接类,在本地通过OCI方式获得Oracle数据库连接
/**
*在本地获得数据库连接
*/
packagecom.j2ee.db;
importjava.util.*;
importjava.sql.*;
importjavax.sql.*;
importjava.io.*;
importoracle.jdbc.driver.*;
importjavax.naming.*;
/**
*通过OCI方式获得Oracle数据库连接
*/
publicclassDbConnection
{
finalstaticStringsDBDriver="oracle.jdbc.driver.OracleDriver";
finalstaticStringsConnStr="jdbc:
oracle:
oci8:
sr/sr@ora199";
/**
*
*/
publicDbConnection()
{
}
/**
*获得Oracle数据库连接
*/
publicjava.sql.ConnectionconnectDbByOci()
{
java.sql.Connectionconn=null;
try
{
Class.forName(sDBDriver);
conn=DriverManager.getConnection(sConnStr);
}
catch(Exceptione)
{
System.out.println("ERROR:
"+e.getMessage());
}
returnconn;
}
}
在连接字符串"jdbc:
oracle:
oci8:
sr/sr@ora199"中,"sr/sr"为Oracle用户的用户名和口令,"ora199"为数据库服务名。
2、thin方式
先到Oracle技术网(JDBCDrivers,同样地将下载后的zip文件的路径设置在环境变量classpath。
然后通过以下的数据库连接类,在本地通过thin方式获得Oracle数据库连接。
/**
*在本地获得数据库连接
*/
packagecom.j2ee.db;
importjava.util.*;
importjava.sql.*;
importjavax.sql.*;
importjava.io.*;
importoracle.jdbc.driver.*;
importjavax.naming.*;
/**
*通过thin方式获得Oracle数据库连接
*/
publicclassDbConnection
{
privateStringsConnStr="";
/**
*缺省构造器
*/
publicDbConnection()
{
sConnStr="jdbc:
oracle:
thin:
@10.1.4.199:
1521:
ora199";
}
/**
*@paramip,serviceName
*/
publicDbConnection(Stringip,StringserviceName)
{
sConnStr="jdbc:
oracle:
thin:
@"+ip+":
1521:
"+serviceName;
}
/**
*通过thin方式获得Oracle数据库的连接.
*/
publicjava.sql.ConnectionconnectDbByThin()
{
java.sql.Connectionconn=null;
try
{
Class.forName(sDBDriver);
conn=DriverManager.getConnection(sConnStr,"sr","sr");
}
catch(Exceptione)
{
System.out.println("ERROR:
"+e.getMessage());
}
returnconn;
}
/**
*通过thin方式获得Oracle数据库的连接.
*@paramuserId,password
*/
publicjava.sql.ConnectionconnectByJdbc(StringuserId,Stringpassword)
{
java.sql.Connectionconn=null;
try
{
Class.forName(sDBDriver);
conn=DriverManager.getConnection(sConnStr,userId,password);
}
catch(Exceptione)
{
System.out.println("ERROR:
"+e.getMessage());
}
returnconn;
}
}
这种方式运用起来比较灵活,简单,具有较强的移植性和适用性。
只要注意连接字符串"jdbc:
oracle:
thin:
@10.1.4.199:
1521:
ora199"中具体参数的设置即可
3、JdbcOdbc桥方式
先通过管理工具中的数据源来添加本地对Oracle数据库的连接,然后通过以下的数据库连接类,在本地通过JdbcOdbc桥方式获得Oracle数据库连接。
/**
*在本地获得数据库连接
*/
packagecom.j2ee.db;
importjava.util.*;
importjava.sql.*;
importjavax.sql.*;
importjava.io.*;
importoracle.jdbc.driver.*;
importjavax.naming.*;
/**
*通过JdbcOdbc桥方式获得Oracle数据库连接
*/
publicclassDbConnection
{
/**
*
*/
publicDbConnection()
{
}
/**
*获得Oracle数据库连接
*/
publicjava.sql.ConnectionconnectDbByJdbcOdbcBridge()
{
java.sql.Connectionconn=null;
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con=DriverManager.getConnection("jdbc:
odbc:
ora199","sr","sr");
}
catch(Exceptione)
{
System.out.println("ERROR:
"+e.getMessage());
}
returnconn;
}
}
在getConnection方法中第一个参数"jdbc:
odbc:
ora199"中的"ora199"为本地ODBC数据源的数据源名称,第二个参数和第三个参数分别为Oracle的用户名和口令。
二、通过连接池获得Oracle数据库连接
这部分主要讲述在iPlanetApplicationServer6.5和SunJavaSystemApplicationServer7中Oracle数据库连接池的配置,以及在应用中如何通过连接池获得数据库的连接。
1、iPlanetApplicationServer6.5连接池的配置
先打开iPlanetApplicationServer6.5的管理控制台,选中"database"面板,再选择"ExternalJDBCDrivers"选项后,点击"Add…"按钮,在弹出的对话框中,添加一个名为"ora-type4"的JDBCDriver。
DriverClasspath:
该参数填写classes12.zip文件的物理路径。
然后在"ExternalJDBCDataSources"中选择"Add…",在弹出的对话框中添加一个JNDI名称为"credit2"的数据源。
DriverType:
选择刚添加好的"ora-type4";
Datasource:
ora199,为Oracle数据库服务名;
Datasource:
ora199,为Oracle数据库服务名;
ConnectionPoolParameters:
图中显示的是缺省设置,可以根据自己环境情况来更改这些设置。
保存完设置后,在"DataSourceSelectionBox"中,选择刚添加的"credit2"数据源,再选择"VendorSpecificProperties"按钮。
在对话中添加一个URL属性。
至此,iPlanetApplicationServer6.5中的数据库连接池配置完毕,重起服务使之生效。
2、SunJavaSystemApplicationServer7连接池的配置
在配置之前将classes12.zip文件置于…/server1/lib目录下。
通过浏览器的4848端口打开SunJavaSystemApplicationServer7的管理界面,选择"server1"->"JDBC"->"ConnectionPools"下的"New…"
添加一个名称为"MyConnectionPool"的Oracle数据库连接池。
"Next"下一步。
在"General"中填写"DatasourceClassname"。
在"Properties"中将不需要的属性删除,同时添加"URL"属性。
"dataSourceName"中填写Oracle数据库服务名。
以下连接池的缺省设置,可以根据自己环境的情况作相应的调整。
选择"Finish"完成连接池的设置。
下一步为"MyConnectionPool"连接池创建一个JNDI,以便应用程序能够通过该名称获得连接池中的连接。
"server1"->"JDBC"->"JDBCResources"下的"New…"
至此,SunJavaSystemApplicationServer7中的数据库连接池配置完毕,重起服务使之生效。
3、通过连接池获得连接
以上在iPlanetApplicationServer6.5和SunJavaSystemApplicationServer7中配置的连接池都可以通过以下的数据库连接类,从连接池中获得Oracle数据库连接。
/**
*从连接池中获得数据库连接
*/
packagecom.j2ee.db;
importjava.util.*;
importjava.sql.*;
importjavax.sql.*;
importjava.io.*;
importoracle.jdbc.driver.*;
importjavax.naming.*;
/**
*通过连接池方式获得Oracle数据库连接
*/
publicclassDbConnection
{
/**
*
*/
publicDbConnection()
{
}
/**
*获得Oracle数据库连接
*/
publicjava.sql.ConnectionconnectDbByConnectionPool()
{
java.sql.Connectionconn=null;
try
{
Contextctx=newInitialContext();
DataSourceds=(DataSource)ctx.lookup("jdbc/credit2");
conn=ds.getConnection();
}
catch(Exceptione)
{
System.out.println("ERROR:
"+e.getMessage());
}
returnconn;
}
}
4、使用连接池的优点使用连接池的优点主要体现在两个方面:
对数据库的连接统一进行配置、管理、监控,以及对数据库连接池的参数进行优化调整,
同时对应用中没有关闭或其他原因造成没有关闭的数据库连接由连接池统一进行管理。
便于应用的移植和后端数据库的切换,
因为在应用中通过统一的JNDI获得数据库的连接,而具体连接的是哪一台机器上的数据库与应用无关。
用户测试账号可用性、注册新用户、登录验证、修改密码等操作业务处理类
///
[WebService(Namespace="http:
//tempuri.org/")]
[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
publicclassUserAction:
IHttpHandler
{
publicvoidProcessRequest(HttpContextcontext)
{
//context.Response.ContentType="text/plain";
//context.Response.Write("HelloWorld");
context.Request.ContentEncoding=Encoding.Default;
stringaction=context.Request["action"];
stringusr=context.Request["usr"];
stringpassword=context.Request["pass"];
stringmachineCode=context.Request["code"];
通过获取参数的内容,我们就可以进行不同的业务处理,这里我使用了一个Action的标志,用来区分是做什么操作的。
stringaction=context.Request["action"];
stringusr=context.Request["usr"];
stringpassword=context.Request["pass"];
stringmachineCode=context.Request["code"];
boolresult=false;
switch(action)
{
case"r":
//检测注册UserAction.ashx?
action=r&usr=&pass=&code=
stringreg=BLLFactory
context.Response.ContentType="text/plain";
context.Response.Write(reg);
break;
以上就是执行一个检测用户是否注册的操作代码,如果授权注册了,返回true,如果用户登录成功但没有授权,返回False,其他错误返回字符串描述。
具体的BLLFactory
publicstringCheckRegisterd(stringusername,stringpasswod,stringcode)
{
boolresult=VerifyUser(username,passwod,code);
if(result)
{
stringcondition=string.Format("Username='{0}'andIsForbid<>true",username);
SoftwareRegisterInfoinfo=base.FindSingle(condition);
if(info!
=null)
{
if(info.IsRegister)
{
if(info.MachineCode!
=code&&
info.LastAccessed.AddMinutes(10)>=DateTime.Now)
{
return"一个账号多处登录!
";
}
else{
info.MachineCode=code;
info.LastAccessed=DateTime.Now;
base.Update(info,info.ID.ToString());
return"true";
}
}
else{
return"false";
}
}
else{
return"账号被锁定";
}
}
else{
return"账号密码不正确";
}
}
那我们在共享软件的地方如何验证用户身份呢,就是通过传递页面参数并调用ashx接口处理,判断返回值即可。
具体操作代码如下所示。
为了简化操作,里面使用了一个我的公用类库来提交数据(辅助类HttpHelper)。
privatevoidbtnOK_Click(objectsender,EventArgse)
{
if(this.txtUserName.Text.Length==0)
{
MessageExUtil.ShowTips("请输入账号密码登录");
return;
}
stringdata=string.Format("action=r&usr={0}&pass={1}&code={2}",this.txtUserName.Text,this.txtPassword.Text,
WHC.OrderWater.Commons.HardwareInfoHelper.GetMacAddress());
HttpHelperhelper=newHttpHelper();
stringresult=helper.GetHtml(Portal.gc.UserActionUrl,data,true);
if(!
string.IsNullOrEmpty(result))
{
if(result.ToLower()=="true")
{
Portal.gc.UserName=this.txtUserName.Text;
Portal.gc.Registered=true;
MessageExUtil.ShowTips("登录成功");
this.DialogResult=DialogResult.OK;
}
elseif(result.ToLower()=="false")
{
MessageExUtil.ShowTips("未授权用户,但可继续使用");
Portal.gc.UserName=this.txtUserName.Text;
Portal.gc.Registered=false;
this.DialogResult=DialogResult.OK;
}
else{
MessageExUtil.ShowTips("操作失败:
"+result);
}
}
else{
MessageExUtil.ShowTips("操作失败");
}
}
以上就是一个功能的完整实现流程,其他的功能也是类似操作,下面给出ashx的完整代码实现,供大家参考,并指正。
///
///用户测试账号可用性、注册新用户、登录验证、修改密码等操作业务处理类
///
[WebService(Namespace="http:
//tempuri.org/")]
[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
publicclassUserAction:
IHttpHandler
{
publicvoidProcessRequest(HttpContextcontext)
{
//context.Response.ContentType="text/plain";
//context.Response.Write("HelloWorld");
context.Request.ContentEncoding=Encoding.Default;
stringaction=context.Request["action"];
stringusr=context.Request["usr"];
stringpassword=context.Request["pass"];
stringmachineCode=context.Request["code"];
stringconditon="";
boolresult=false;
switch(action)
{
case"r":
/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 连接 数据库
![提示](https://static.bdocx.com/images/bang_tan.gif)