|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你总不能说你写框架吧,那无疑会加大工作量,现在大多企业采取的是折中的办法,就是改别人写好的框架,可要改框架,前提是你对这个框架足够的了解,这就更难了。connection|数据|数据库
原文:
明天企业使用情况中一样平常情形下要面临不止一个或一类数据库;另外一方面分歧时代的分歧品种的数据库构成一个个的荒岛;在java中,手艺潮水偏向于不是间接操纵数据库纪录,而是经由过程两头层的数据库对象耐久化处置到达OO的目标。不管那一种,都请求对照简单空中对多个数据库毗连。多个数据库毗连对照为人所熟习的是微软的ODBC数据源设置,除没有完成两头层耐久化外,ODBC实在比JDBC要周全也更简单处置。ConnectionManager是一个经由过程XML设置的,相似于ODBC数据源设置的工具,经由过程界说dao.Connection对象,程序能够按必要以:java.sql.Connectionconn=ConnectionManager.getConnection(${connectionname});失掉所必要的毗连,从而简化了在多个数据库情况下的编纂事情。
如今项目开辟者面对的经常是多个数据库的使用,汗青的和分歧部门的,有CS背景的也有BS前台的。各个数据库的数据必需融汇到统一个营业逻辑中,不然就成为一个个低代价的数据孤岛。应对这类需求,今朝利用了两种手艺,一是数据对象化手艺,本色就是在数据层和使用逻辑层两头拔出一个耐久对象化层,经由过程程序或容器使数据对象与数据纪录相分歧,而使用逻辑间接会见数据对象而不是数据库纪录;二是经由过程利用全局目次变更利用多个数据库供数据对象化办理层利用。不管是EJBENTITy,仍是Hibernate,抑或是我处已写的HanvaProcessor都是这类思绪的一种表现。
其实不老是必要接纳EJB才干办理多个数据源,况且年夜部分项目中接纳EJB带的是更高的本钱和功能的更低效,开辟事情更庞大化,乃至只是试试看地填代码再公布不可再填代码再试试看,(我自己很厌恶这类开辟感到,以是弄了一个Hanva的小项目,除非客户指定EJB了)。不外EJB容器中办理多个数据源的体例仍是很值得进修的。年夜部分情形下,它是经由过程初始化后的数据源对象,象毗连池,注册进JNDISPI;然后经由过程java.naming.Context.lookup()这个全局称号(在JVM局限内)。我的做法是由写一个ConnectionManager,它由一个xml文件界说多个数据库毗连相干的参数,在ConnectionManager初始化时读进内存。利用时然后经由过程挪用ConnectionManager的静态办法getConnection(Stringconnectionname),就能够失掉指定命据库毗连。因为实践上操纵数据库毗连的都是Processor和Lister两个类,如许,要包管毗连资本的开释也是很有掌控的。依托这个办法,就能够在轻型的使用中都能够弄妥多半据库,利用数据对象化体例举行开辟了。
connections.xml界说:
<connection-set><description><![CDATA[connection-set供ConnectionManager利用,能够按必要取用不定的多个毗连界说,代码完整稳定。从而顺应多半据库的利用情况;]]></description><connectionname="GlobalPool"driver="datasource"uri="java:comp/env/globalpool"/><connectionname="MysqlPool"driver="datasource"uri="java:comp/env/mysqlpool"/><connectionname="mysql"driver="com.mysql.jdbc.Driver"username="michelle"password="favordog"><uri><![CDATA[jdbc:mysql://127.0.0.1:3306/dkt?useUnicode=true&characterEncoding=gb2312]]></uri></connection><connectionname="conn"driver="oracle.jdbc.driver.OracleDriver"uri="jdbc:oracle:thin:@127.0.0.1:1521:dkt0"username="dcon"password="girlfriend"/><connectionname="reso"driver="oracle.jdbc.driver.OracleDriver"uri="jdbc:oracle:thin:@127.0.0.1:1521:dkt0"username="erso"password="abc"/><connectionname="daifu"driver="oracle.jdbc.driver.OracleDriver"uri="jdbc:oracle:thin:@127.0.0.1:1521:dkt0"username="eef"password="qwewer"/><connectionname="system"driver="oracle.jdbc.driver.OracleDriver"uri="jdbc:oracle:thin:@127.0.0.1:1521:dkt0"username="system"password="manager"/></connection-set>
ConnectionManager办法:
publicclassConnectionManager{privatestaticLOGGERlogger=(LOGGER)Loger.getLogger(Constants.LOGGER_DAIFU_KEY);
publicstaticsynchronizedjava.sql.ConnectiongetConnection()throwsjava.sql.SQLException{Stringname=Repository.getInstance().getConn();returngetConnection(name);}
publicstaticsynchronizedjava.sql.ConnectiongetConnection(Stringname)throwsjava.sql.SQLException{if(Repository.getInstance()==null){logger.error("therepositoryfordaooperationhasnotbeeninitialized");returnnull;}dao.Connectionconn=Repository.getInstance().getConnection(name);Stringdri=conn.getDriver();java.sql.Connectioncn=null;try{if(dri.equalsIgnoreCase("datasource")){javax.naming.ContextinitCtx=newjavax.naming.InitialContext();javax.sql.DataSourceds=(javax.sql.DataSource)initCtx.lookup(conn.getUri());cn=ds.getConnection();}else{Class.forName(dri);//nonewInstance();onlygetclasscn=java.sql.DriverManager.getConnection(conn.getUri(),conn.getUsername(),conn.getPassword());}}catch(Exceptionex){Stringmsg="ConnectionManager.class,conname:="+name+";dri:="+dri+";cn:="+cn+";msg:="+ex.getMessage();logger.error(msg,ConnectionManager.class);thrownewjava.sql.SQLException(msg);}returncn;}publicstaticsynchronizedjava.sql.ConnectiongetConnection(dao.Connectionconn)throwsjava.sql.SQLException{if(conn==null){System.out.println("thedao.ConnectiontogetConnectionisnull;");returnnull;}Stringdri=conn.getDriver();java.sql.Connectioncn=null;try{if(dri.equalsIgnoreCase("datasource")){javax.naming.ContextinitCtx=newjavax.naming.InitialContext();javax.sql.DataSourceds=(javax.sql.DataSource)initCtx.lookup(conn.getUri());cn=ds.getConnection();}else{Class.forName(dri);//nonewInstance();onlygetclasscn=java.sql.DriverManager.getConnection(conn.getUri(),conn.getUsername(),conn.getPassword());}}catch(Exceptionex){Stringmsg="dri:="+dri+";cn:="+cn+";msg:="+ex.getMessage();logger.error(msg,ConnectionManager.class);thrownewjava.sql.SQLException(msg);}returncn;}publicstaticvoidmain(String[]args)throwsException{if(args==null||args.length<2){System.out.println("Pleaseinputthexmlandconnsname");return;}Repository.parse(args[0]);java.sql.Connectionconn=getConnection(args[1]);System.out.println(conn);}
}
挪用时只必要
java.sql.Connectionconn=ConnectionManager.getConnection("connn");
就能够失掉指定体例的数据库毗连。
C#跟java类似,但是在跨平台方面理论上可以跨平台,实际上应用不大,执行性能优于java,跟C++基本一致,但是启动速度还是慢.代码安全,但容易性能陷阱. |
|