摘要:   阅读全文
posted @ 2009-06-11 21:05 旭日 阅读(961) | 评论 (0)编辑 收藏
 



组合:Spring+Hibernate+struts+java+jsp
要求功能:比如又A,B,C三个数据库,需要查询A,B数据库的某个数据,然后将此查询到的数据存入C中。
求问:此功能如何实现呢?
            小弟急要,谢谢。

posted @ 2009-06-06 12:21 旭日 阅读(337) | 评论 (1)编辑 收藏
 
Spring2.0.1以后的版本已经支持配置多数据源,并且可以在运行的时候动态加载不同的数据源。通过继承AbstractRoutingDataSource就可以实现多数据源的动态转换。目前做的项目就是需要访问12个数据源,每个数据源的表结构都是相同的,所以要求数据源的变动对于编码人员来说是透明,也就是说同样SQL语句在不同的环境下操作的数据库是不一样的。具体的配置如下: 
一、首先需要写一个静态的键值对照类: 


代码 
package cn.com.xinli.ccp.dynamicds; 

public class DataSourceMap 
public static final String Admin="Admin"
public static final String Yxh = "Yxh"
}
 

 

这个类主要在使用的时候当作获得数据源的标志使用。 
二、建立一个获得和设置上下文的类: 


代码 
package cn.com.xinli.ccp.dynamicds; 

public class CustomerContextHolder 
private static final ThreadLocal contextHolder = 
new ThreadLocal(); 

public static void setCustomerType(String customerType) 
contextHolder.set(customerType); 
}
 

public static String getCustomerType() 
return (String) contextHolder.get(); 
}
 

public static void clearCustomerType() 
contextHolder.remove(); 
}
 

}
 

这个主要负责设置上下文环境和获得上下文环境。 
三、建立动态数据源类,这个类必须继承AbstractRoutingDataSource: 

代码 
package cn.com.xinli.ccp.dynamicds; 

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; 

public class DynamicDataSource extends AbstractRoutingDataSource 

protected Object determineCurrentLookupKey() 
// TODO Auto-generated method stub 
return CustomerContextHolder.getCustomerType(); 
}
 

}
 

这个类实现了determineCurrentLookupKey方法,该方法返回一个Object,一般是返回字符串,也可以是枚举类型。该方法中直接使用了CustomerContextHolder.getCustomerType()方法获得上下文环境并直接返回。
 
四、编写spring的配置文件配置数据源 

代码 
<bean id="parentDataSource" 
class
="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
<property name="driverClassName"> 
<value>COM.ibm.db2.jdbc.net.DB2Driver</value> 
</property> 
<property name="url"> 
<value>jdbc:db2:127.0.0.1:TEST</value> 
</property> 
</bean> 

<bean id="adminDataSource" parent="parentDataSource"> 
<property name="username" value="admin"/> 
<property name="password" value="master997mb"/> 
</bean> 

<bean id="yxhDataSource" parent="parentDataSource"> 
<property name="username" value="yxh"/> 
<property name="password" value="yxh"/> 
</bean> 

在这个配置中可以看到首先有个parentDataSource,这个主要配置一些数据源的公用信息,项目中都是链接DB2数据库;adminDataSource和yxhDataSource是根据不同需要配置的个性化信息,但都必须加parent属性,值为parentDataSource。这样就配置好了2个数据源信息。当然如果链接的多数据源是不同类型的两个数据库,那么parentDataSource就可以不要了,直接配置两个不同的数据源链接就可以了。 
五、编写spring配置文件配置多数据源映射关系 

代码 
<bean id="dataSource" class="cn.com.xinli.ccp.dynamicds.DynamicDataSource"> 
<property name="targetDataSources"> 
<map key-type="java.lang.String"> 
<entry key="Yxh" value-ref="yxhDataSource"/> 
</map> 
</property> 
<property name="defaultTargetDataSource" ref="adminDataSource"/> 
</bean> 

在这个配置中第一个property属性配置目标数据源,
<map key-type="java.lang.String">中的key-type必须要和静态键值对照类DataSourceMap中的值的类型相同;<entry key="Yxh" value-ref="yxhDataSource"/>中key的值必须要和静态键值对照类中的值相同,如果有多个值,可以配置多个<entry>标签。第二个property属性配置默认的数据源。 
六、配置hibernate。 
Hibernate的配置和普通的hibernate、spring结合的配置一样 

代码 
<bean id="sessionFactory" 
class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
<!-- to override, use the "SpringDatasourceConfig" snippet in your project --> 
<property name="dataSource"> 
<ref local="dataSource" /> 
</property> 
<property name="mappingResources"> 
<list> 
<value> 
cn/com/xinli/ccp/entity/User.hbm.xml 
</value> 
<value> 
cn/com/xinli/ccp/entity/Test.hbm.xml 
</value> 
</list> 
</property> 
<property name="hibernateProperties"> 
<props> 
<prop key="hibernate.dialect"> 
org.hibernate.dialect.DB2Dialect 
</prop> 

<prop key="hibernate.show_sql">true</prop> 
<prop key="hibernate.use_outer_join">true</prop> 
<prop key="hibernate.jdbc.batch_size">50</prop> 
<prop key="hibernate.jdbc.fetch_size">5</prop> 
<prop key="hibernate.connection.pool_size">2</prop> 
<prop key="hibernate.connection.autocommit">false</prop> 
<prop key="hibernate.cache.use_query_cache">false</prop> 
<prop key="hibernate.max_fetch_depth">1</prop> 
<prop key="hibernate.bytecode.use_reflection_optimizer">true</prop> 
</props> 
</property> 
</bean> 

<bean id="mydao" class="cn.com.xinli.ccp.dao.HibernateBaseDao"> 
<property name="sessionFactory"> 
<ref local="sessionFactory" /> 
</property> 
</bean> 

关于dao的代码这里就省略了。 
七、配置结束,可以使用了。 
代码 
public class DaoTest extends TestCase 

public void testSave() throws Exception
CustomerContextHolder.setCustomerType(DataSourceMap.Admin);
//设置数据源 
//hibernate创建实体 
Test test = new Test(); 
test.setTest(
"22222222"); 

mydao.save(test);
//使用dao保存实体 

CustomerContextHolder.setCustomerType(DataSourceMap.Yxh);
//设置为另一个数据源 

mydao.save(test);
//使用dao保存实体到另一个库中 

}
 
}
 
在项目中对于编码人员对多数据源的切换可以做成透明的,操作同样的dao,就可以访问不同的数据库了


posted @ 2009-05-30 21:36 旭日 阅读(421) | 评论 (1)编辑 收藏
 
     摘要: 多数 java 程序员都非常清楚使用 jar 文件将组成 java 解决方案的各种资源(即 .class 文件、声音和图像)打包的优点。刚开始使用 jar 文件的人常问的一个问题是:“如何从 jar 文件中提取图像呢?”本文将回答这个问题,并会提供一个类,...  阅读全文
posted @ 2009-05-30 21:27 旭日 阅读(234) | 评论 (2)编辑 收藏
 
今天整合SSH,出现了这个问题Context initialization failed,很是郁闷。

ERROR [org.springframework.web.struts.ContextLoaderPlugIn] - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'headsService' defined in ServletContext resource [/WEB-INF/classes/applicationContext-heads.xml]: Initialization of bean failed; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'hDao' of bean class [com.forestryInfo.biz.impl.HeadsBizImpl]: No property 'hDao' found
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:
478)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$
1.run(AbstractAutowireCapableBeanFactory.java:409)
 at java.security.AccessController.doPrivileged(Native Method)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:
380)
 at org.springframework.beans.factory.support.AbstractBeanFactory$
1.getObject(AbstractBeanFactory.java:264)
 at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:
220)
 at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:
261)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:
185)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:
164)
 at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:
429)
 at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:
729)
 at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:
381)
 at org.springframework.web.struts.ContextLoaderPlugIn.createWebApplicationContext(ContextLoaderPlugIn.java:
354)
 at org.springframework.web.struts.ContextLoaderPlugIn.initWebApplicationContext(ContextLoaderPlugIn.java:
295)
 at org.springframework.web.struts.ContextLoaderPlugIn.init(ContextLoaderPlugIn.java:
225)
 at org.apache.struts.action.ActionServlet.initModulePlugIns(ActionServlet.java:
869)
 at org.apache.struts.action.ActionServlet.init(ActionServlet.java:
336)
 at javax.servlet.GenericServlet.init(GenericServlet.java:
212)
 at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:
1139)
 at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:
966)
 at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:
3956)
 at org.apache.catalina.core.StandardContext.start(StandardContext.java:
4230)
 at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:
1116)
 at org.apache.catalina.startup.HostConfig.check(HostConfig.java:
1214)
 at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:
293)
 at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:
120)
 at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:
1306)
 at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:
1570)
 at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:
1579)
 at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:
1559)
 at java.lang.Thread.run(Thread.java:
619)
Caused by: org.springframework.beans.InvalidPropertyException: Invalid property 
'hDao' of bean class [com.forestryInfo.biz.impl.HeadsBizImpl]: No property 'hDao' found
 at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:
382)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:
1287)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:
1248)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:
1008)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:
470


这里主要提示:
Error creating bean with name 'headsService' defined in ServletContext resource [/WEB-INF/classes/applicationContext-heads.xml]: Initialization of bean failed; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'hDao' of bean class 



我找了好久错误的原因,但都没有找到。
后面,我干脆讲“hDao”改为“dao”,整个程序就能运行起来了。
很是无奈,想了好久还是想不明白。
posted @ 2009-05-29 16:50 旭日 阅读(6512) | 评论 (2)编辑 收藏
 
public class ploytest {

public static void main(String[] args) {
A a = new A();
B b = new B();
a.s = "[AA]";
b.s = "[BB]";
a = b;
System.out.println(a.s);
System.out.println(b.s);
System.out.println(a.getS());
System.out.println(b.getS());
System.out.println("====================");
((A)b).s = "[AA]";
System.out.println(a.s);
System.out.println(b.s);
System.out.println(a.getS());
System.out.println(b.getS());
}
}

class A {
String s = "[A]";
String getS() {
return s;
}
}

class B extends A{
String s = "";
String getS() {
return s;
}
}
The results:
[A]
[BB]
[BB]
[BB]
====================
[AA]
[BB]
[BB]
[BB]
其实结果不重要。一运行就知道。主要是原理。
将子类对象赋值给父类对象,所得到对象是这样的一个对象:
它是一个编译是为父类对象,但运行却是一个子类对象,具体特征如下.
1.被声明为父类对象
2.拥有父类属性
3.占用子类的内存空间
4.子类方法覆盖父类的方法时,此时对象调用的是子类的方法;否则,自动调用继承父类的方法.
5.我人认为这个对象既不是父类对象,也不是子类对象.当我们用到它的方法时,
我便把它看成子类对象;若用到它的属性时,我把它看成父类对象.
它是一个占用父类属性,而使用子类方法的对象.至于到底是什么对象,我认为还是得根据声明来,它应算是父类对象,但拥有子类方法.
这就是为什么第一个a.s为[A]的道理了。
(A)b是向上转型。(A)b.s相当于把"[AA]"赋值给b的父类对象。所以由上面可以看出。a.s为[AA]而其他的都同上
 
System.out.println(a.getS()); System.out.println(b.getS()); 再看这条语句: a.s = "[AA]"; //这是给对象a中s赋值,跟上转型.s一点关系都没有,不要被弄混,紧记这里面有3个对象,你就会明白的
 
看了前几个留言怎么也没看出来为什么"第一个a.s为[A]的道理". 依我看,这题有三个对象,希望提问者不要弄混. 这三个对象分别是a,b,b的上转型对象, a = b; //自这条语句以下,a便不是a对象,而是b的上转型对象 System.out.println(a.s); System.out.println(b.s);
关键还是a = b; 这句话,其相当于a =(A) b; 所以第一句打印的是[A] 而非[AA]
posted @ 2009-04-24 15:55 旭日 阅读(558) | 评论 (0)编辑 收藏
仅列出标题
共2页: 上一页 1 2