hibernate连接多数据库,同样表结构的问题

问题描述

现有一个项目,采用sping+struts2+hibernate开发。有多个数据库,数据库中的表的结构完全相同。不同的用户登录后,连接到相应的数据库。现在有一问题,就是如何在hibernate中配置数据库链接?如果在hibernate中配置多数据库链接,该怎么配置?

解决方案

如果你用spring的话,可以用下面的饿配置: <code> <!-- 配置多数据源 --><bean id="dataSource" class="com.xeranx.common.db.DynamicDataSource"><property name="targetDataSources"><map key-type="java.lang.String"><entry key="0" value-ref="dataSource0" /><entry key="1" value-ref="dataSource1" /></map></property><property name="defaultTargetDataSource" ref="dataSource0" /></bean><bean id="dataSource0" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName" value="${db.default.jdbc.driverClassName}" /><property name="url" value="${db.default.jdbc.url}" /><property name="username" value="${db.default.jdbc.username}" /><property name="password" value="${db.default.jdbc.password}" /><property name="initialSize" value="${db.default.dbcp.initialSize}" /><property name="maxIdle" value="${db.default.dbcp.maxIdle}" /><property name="minIdle" value="${db.default.dbcp.minIdle}" /><property name="maxActive" value="${db.default.dbcp.maxActive}" /><property name="logAbandoned" value="${db.default.dbcp.logAbandoned}" /><property name="removeAbandoned" value="${db.default.dbcp.removeAbandoned}" /><property name="removeAbandonedTimeout" value="${db.default.dbcp.removeAbandonedTimeout}" /><property name="maxWait" value="${db.default.dbcp.maxWait}" /><property name="validationQuery" value="${db.default.dbcp.validationQuery}" /><property name="testOnBorrow" value="${db.default.dbcp.testOnBorrow}" /><property name="testOnReturn" value="${db.default.dbcp.testOnReturn}" /><property name="testWhileIdle" value="${db.default.dbcp.testWhileIdle}" /><property name="timeBetweenEvictionRunsMillis"value="${db.default.dbcp.timeBetweenEvictionRunsMillis}" /><property name="numTestsPerEvictionRun" value="${db.default.dbcp.numTestsPerEvictionRun}" /><property name="minEvictableIdleTimeMillis"value="${db.default.dbcp.minEvictableIdleTimeMillis}" /></bean><bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName" value="${db.default.jdbc.driverClassName}" /><property name="url" value="${db.default.jdbc.url}" /><property name="username" value="${db.zs.jdbc.username}" /><property name="password" value="${db.zs.jdbc.password}" /><property name="initialSize" value="${db.default.dbcp.initialSize}" /><property name="maxIdle" value="${db.default.dbcp.maxIdle}" /><property name="minIdle" value="${db.default.dbcp.minIdle}" /><property name="maxActive" value="${db.default.dbcp.maxActive}" /><property name="logAbandoned" value="${db.default.dbcp.logAbandoned}" /><property name="removeAbandoned" value="${db.default.dbcp.removeAbandoned}" /><property name="removeAbandonedTimeout" value="${db.default.dbcp.removeAbandonedTimeout}" /><property name="maxWait" value="${db.default.dbcp.maxWait}" /><property name="validationQuery" value="${db.default.dbcp.validationQuery}" /><property name="testOnBorrow" value="${db.default.dbcp.testOnBorrow}" /><property name="testOnReturn" value="${db.default.dbcp.testOnReturn}" /><property name="testWhileIdle" value="${db.default.dbcp.testWhileIdle}" /><property name="timeBetweenEvictionRunsMillis"value="${db.default.dbcp.timeBetweenEvictionRunsMillis}" /><property name="numTestsPerEvictionRun" value="${db.default.dbcp.numTestsPerEvictionRun}" /><property name="minEvictableIdleTimeMillis"value="${db.default.dbcp.minEvictableIdleTimeMillis}" /></bean> </code> //动态数据源的代码 <code>public class DynamicDataSource extends AbstractRoutingDataSource {/** * log4j 记录器 */private static final Logger log = Logger.getLogger(DynamicDataSource.class);/** * 决定返回那个数据源 */protected Object determineCurrentLookupKey() {String dataSourceId = ParameterCache.getDatasourceProp(ThreadLocalContext.getUserId());log.debug("使用数据源" + (dataSourceId == null ? "0" : dataSourceId));return dataSourceId;}} </code>//线程局部变量用来持久当前登录用户<code>public class ThreadLocalContext {/** * 线程局部变量,用来保存当前用户id */public static ThreadLocal userThreadLocal;static {userThreadLocal = new ThreadLocal();}public static String getUserId() {return (String) userThreadLocal.get();}public static void setUserId(String userId) {userThreadLocal.set(userId);}}</code> 你可以参考下代码,具体不清楚的在根据以上内容到网上找找答案,相关资料非常多。不过以上配置不支持同一个方法连接多个数据源的事物。
解决方案二:
一份代码,配置2套spring的dao实现(templatesupport中注入不同的sessionfactory)业务层注入2个dao(接口相同)即可
解决方案三:
1、配置两个数据源aDataSoruce(连接A数据库)和bDataSource(连接B数据库) 2、让aDAO使用aDataSoruce,bDAO使用bDataSoruce 3、建立一个service,让它包括两个DAO
解决方案四:
多数据源问题,每个数据源对应一个SessionFactory.

时间: 2024-10-26 21:16:50

hibernate连接多数据库,同样表结构的问题的相关文章

表单-多表头和可变表头(一条信息的数据量大小可变。)该怎么设计数据库的表结构。

问题描述 多表头和可变表头(一条信息的数据量大小可变.)该怎么设计数据库的表结构. 我现在有一个表单需要存入数据库.但是客户要求该表单的 表头可变.也就是他要自定义表单.这种情况我该怎么为这张表单设计表结构了?同时该表单中的所有字段都要参加计算的,有些项的值是其他项通过计算得出的.虽然是简单的加减乘除,但是客户要求可以自动的计算.小弟用的Spring MVC+JPA 数据库mysql 或者 oracle 解决方案 一般一个表单中的字段分为固定的字段和 动态的字段. 将固定的字段,设计成一张表,称

使用hibernate连接Oracle数据库报错

问题描述 使用hibernate连接Oracle数据库报错 Exception in thread ""main"" org.hibernate.exception.GenericJDBCException: Cannot open connection at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140) at org

PowerDesigner连接Oracle数据库建表序列号实现自动增长

原文:PowerDesigner连接Oracle数据库建表序列号实现自动增长 创建表就不说了.下面开始介绍设置自动增长列.  1 在表视图的列上创建.双击表视图,打开table properties --->columens ,双击要设置的列(显示列的序号的那个按钮,单击后,会显示横向的黑色箭头).打开column properties 对话框.在 'general' 项中,最下面,找到 sequence,下拉框 后面,有三个按钮就 'create','select','properties'.

ORACLE数据库对比表结构

有时候会有某种需求:需要对比两个表的表结构是否一致,有时候甚至是整个数据库所有表的表结构对比.......表结构对比无非就是字段名.字段类型.字段数据类型.以及字段的顺序的对比.如果需要对比表结构,可以通过下面简单的脚本实现: SELECT M.OWNER       ,M.TABLE_NAME       ,M.COLUMN_ID       ,M.COLUMN_NAME       ,M.DATA_TYPE       ,M.DATA_LENGTH       ,N.OWNER      

SSH2项目中 如何发一条语句访问多个sql2000数据库(表结构完全相同)

问题描述 产生背景:当要存贮的数据量非常大,单一的某种数据库不能满足数据量的要求,因此需要将数据分库存贮(数据表结构相同,但数据不同,数据不交叉),这种存贮方式,为程序的开发(提取数据,数据存贮)带来了不便,如果没有数据网关,则需要(1)程序去判断数据在哪里(2)程序进行跨库操作时,事务同步不好控制,数据网关的设计就是为了解决以上不便(1)应用程序只面对一个数据提供者,即数据网关,多数据源对应用程序时透明的,例如程序执行select*fromtab:数据网关会在各个数据库中执行select*fr

Alter改变MySQL数据库的表结构例子

在数据库的使用过程中,有时需要改变它的表结构,包括改变字段名,甚至改变不同数据库字段间的关系.可以实现上述改变的命令是alter,其基本语法如下: altertabletable_namealter_spec[,alter_spec- 1:删除列 ALTERTABLE[表名字]DROP[列名称] 2:增加列 ALTERTABLE[表名字]ADD[列名称]INTNOTNULLCOMMENT'注释说明' 3:修改列的类型信息 ALTERTABLE[表名字]CHANGE[列名称][新列名称(这里可以用

查询数据库中,表结构的详细信息

数据|数据库 SELECT  表名=case when a.colorder=1 then d.name else '' end, 字段序号=a.colorder, 字段名=a.name, 标识=case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end, 主键=case when exists(SELECT 1 FROM sysobjects where xtype='PK' and name in (  

C#如何获取DB2数据库的表结构(字段名,类型,长度等)急!求帮助!

问题描述 是直接通过查询语句例如:select*fromtb_user然后就可以看到表结构,不能查询系统表的表结构,因为可能会有联合查询,求i大神帮忙解决一下!谢谢! 解决方案 解决方案二:试试select*fromsyscolumnswheretbname='xxxx',没尝试过系统表,你看看能不能吧解决方案三:我的意思是将就最开始select*fromtb_user这种sql语句,然后通过C#的一些方法获取表结构,不需要用其他的SQL语句解决方案四:引用2楼qq_32158605的回复: 我

erwin如果导出数据库表结构为xml格式文件

问题描述 erwin如果导出数据库表结构为xml格式文件 erwin如果导出数据库表结构为xml格式文件,现已经连接oracle数据库 导入表显示模型了,我需要erwin这些表结构用于数据采集 解决方案 http://blog.itpub.net/134308/viewspace-140582/ 解决方案二: 用powerdesigner可以搞 解决方案三: 谢谢 我已经导出来文件啦 erwin里面有save as 点击可以保存为xml格式的文件 供大家分享