A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 熊永标 中级黑马   /  2013-3-12 11:05  /  2169 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

<?xml version="1.0" encoding="UTF-8"?>
<!--
  PROPAGATION_REQUIRED——支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
  PROPAGATION_SUPPORTS——支持当前事务,如果当前没有事务,就以非事务方式执行。
  PROPAGATION_MANDATORY——支持当前事务,如果当前没有事务,就抛出异常。
  PROPAGATION_REQUIRES_NEW——新建事务,如果当前存在事务,把当前事务挂起。
  PROPAGATION_NOT_SUPPORTED——以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  PROPAGATION_NEVER——以非事务方式执行,如果当前存在事务,则抛出异常。
  PROPAGATION_NESTED——如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
  <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
  <property name="url" value="jdbc:mysql://localhost:3306/SSH"></property>
  <property name="username" value="root"></property>
  <property name="password" value="xyb888890"></property>
  <property name="initialSize" value="1"></property>
  <property name="maxActive" value="100"></property>
  <property name="maxIdle" value="2"></property>
  <property name="minIdle" value="1"></property>
</bean>
<bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource" ref="dataSource"></property>
  <property name="mappingResources">
   <list>
    <value>com/qdn/SSH/demain/user_hbm.xml</value>
   </list>
  </property>
  <property name="hibernateProperties">
   <value>
    hibernate.dialect=org.hibernate.dialect.MySQLDialect
    hibernate.hbm2ddl.auto=create
   </value>
  </property>
</bean>
<bean id="transactionManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="userDaoTarget" class="com.qdn.SSH.dao.impl.UserDao" scope="prototype">
  <property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="userDao"
  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" scope="prototype">
  <property name="transactionManager" ref="transactionManager"></property>
  <property name="target" ref="userDaoTarget" />
  <property name="proxyInterfaces" value="com.qdn.SSH.dao.IUser"></property>
  <property name="transactionAttributes">
   <props>
    <prop key="get*">PROPAGATION_NOT_SUPPORTED,readOnly</prop>
    <prop key="*">PROPAGATION_REQUIRED</prop>
   </props>
  </property>
</bean>
</beans>
这是Spring的bean配置文件,我想问一下如果不加上述纵横驰红色字体的部份,会不会产生线程安全的问题呢
下面是Dao层的代码:
  1. package com.qdn.SSH.dao.impl;

  2. import java.util.List;

  3. import org.hibernate.NonUniqueResultException;
  4. import org.hibernate.Query;
  5. import org.hibernate.Session;
  6. import org.hibernate.SessionFactory;
  7. import org.hibernate.Transaction;

  8. import com.qdn.SSH.dao.IUser;
  9. import com.qdn.SSH.demain.UserBean;

  10. public class UserDao implements IUser {
  11. private SessionFactory sessionFactory;

  12. public void setSessionFactory(SessionFactory sessionFactory) {
  13. this.sessionFactory = sessionFactory;
  14. }

  15. @Override
  16. public void addUser(UserBean user) {
  17. //sessionFactory.getCurrentSession().persist(user);
  18. System.out.println(sessionFactory);
  19. }

  20. @Override
  21. public void updateUser(UserBean user) {
  22. sessionFactory.getCurrentSession().merge(user);
  23. }

  24. @Override
  25. public UserBean findUser(int id) {
  26. return (UserBean) sessionFactory.getCurrentSession().get(
  27. UserBean.class, id);
  28. }

  29. @Override
  30. public UserBean findUser(String username, String password) {
  31. return findUser(
  32. "from UserBean as user where user.username=? and user.password=?",
  33. username, password);
  34. }

  35. @Override
  36. public UserBean findUser(String hql, Object... args) {
  37. Query q = sessionFactory.getCurrentSession().createQuery(hql);
  38. for (int i = 0; i < args.length; i++) {
  39. q.setParameter(i, args[i]);
  40. }
  41. return (UserBean) q.uniqueResult();
  42. }

  43. @SuppressWarnings("unchecked")
  44. @Override
  45. public List<UserBean> getUsers() {
  46. return sessionFactory.getCurrentSession().createQuery("from UserBean")
  47. .list();
  48. }

  49. @Override
  50. public void deleteUser(int id) {
  51. Session session = sessionFactory.getCurrentSession();
  52. UserBean user = (UserBean) session.get(UserBean.class, id);
  53. session.delete(user);
  54. }
  55. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

3 个回复

倒序浏览
这个和线程安全问题倒是不大搭关联,主要是一个作用域问题。 取决你的程序要怎么做。 默认是singleton(单例)作用域。 property作用域的Bean会导致在每次对该Bean请求(将其注入到另一个Bean中,或者以程序的当时调用容器的getBean()方法)时都会创建一个新的Bean实例。根据经验,对有状态的Bean应用使用prototype作用域,而对无状态的Bean则应该使用singleton作用域.

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 新人,鼓励一下~

查看全部评分

回复 使用道具 举报
王家辉 发表于 2013-3-12 11:48
这个和线程安全问题倒是不大搭关联,主要是一个作用域问题。 取决你的程序要怎么做。 默认是singleton(单 ...

正因为每次得到的都是单例,如果有两个人同时访问一bean,调用的就是一个方法,而我那些方法并没有实现同步,比如调用这个方法时:
  1. public void deleteUser(int id) {

  2. Session session = sessionFactory.getCurrentSession();

  3. UserBean user = (UserBean) session.get(UserBean.class, id);

  4. session.delete(user);

  5. }

  6. }

复制代码
就有可能出现线程安的问题,不对不!,如果把属性设置为prototype的话,每次都得到的是一个新的实现,就不会出错线程的安全问题了,不是吗?
回复 使用道具 举报
熊永标 发表于 2013-3-12 12:26
正因为每次得到的都是单例,如果有两个人同时访问一bean,调用的就是一个方法,而我那些方法并没有实现同步, ...

嗯。就设置scope=prototype就OK了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马