查看: 2515|回复: 0

[Mysql数据库] 在javaee的三层结构中,为什么事物存在于业务层

发表于 2018-3-11 10:11:14

我们都知道在javaee实际开发中,分为3层结构来开发,controller,service和dao

那么为什么事物要存在于业务层中,事物是通过connection对象操作的,使用原始jdbc链接数据库的链接也是connection操作的,connection是在到是怎么传递到dao的呢?

这里讲解两种方式
第一种通过形式参数的方式
在javaee的三层结构中,为什么事物存在于业务层
第二种通过ThreadLocal的方式
ThreadLocal的底层是个map,该map的key是固定的,当前线程。value可以让我们存入任意对象

在javaee的三层结构中,为什么事物存在于业务层

  1. public class JdbcUtils {
  2. // 成员变量,创建了C3P0的连接池(连接池中已经存在连接了...)
  3. private static final ComboPooledDataSource DATASOURCE = new ComboPooledDataSource();
  4. // 把Connection绑定到当前的线程中
  5. private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
  6. /**
  7. * 返回的是C3P0的连接池
  8. * @return
  9. */
  10. public static DataSource getDataSource(){
  11. return DATASOURCE;
  12. }
  13. /**
  14. * 获取连接,返回连接
  15. * @return
  16. * @throws SQLException
  17. */
  18. public static Connection getConnection() throws SQLException{
  19. Connection conn = null;
  20. // 从tl中获取
  21. conn = tl.get();
  22. if(conn == null){
  23. // 从连接池中获取连接
  24. conn = DATASOURCE.getConnection();
  25. // 非常关键,把连接存入到tl中
  26. tl.set(conn);
  27. }
  28. return conn;
  29. }
  30. /**
  31. * 开启事务
  32. * @throws SQLException
  33. */
  34. public static void beginTransaction() throws SQLException{
  35. // 调用getConnection()
  36. Connection conn = getConnection();
  37. conn.setAutoCommit(false);
  38. }
  39. /**
  40. * 提交事务
  41. * @throws SQLException
  42. */
  43. public static void commitTransaction() throws SQLException{
  44. // 调用getConnection()
  45. Connection conn = getConnection();
  46. conn.commit();
  47. }
  48. /**
  49. * 回滚事务
  50. * @throws SQLException
  51. */
  52. public static void rollBackTransaction() throws SQLException{
  53. // 调用getConnection()
  54. Connection conn = getConnection();
  55. conn.rollback();
  56. }
  57. /**
  58. * 归还连接
  59. * @throws SQLException
  60. */
  61. public static void closeConn() throws SQLException{
  62. // 调用getConnection()
  63. Connection conn = getConnection();
  64. conn.close();
  65. tl.remove();
  66. }
  67. /**
  68. * 释放资源
  69. * @param stmt
  70. * @param conn
  71. */
  72. public static void release(Statement stmt,Connection conn){
  73. if(stmt != null){
  74. try {
  75. stmt.close();
  76. } catch (SQLException e) {
  77. e.printStackTrace();
  78. }
  79. }
  80. if(conn != null){
  81. try {
  82. // 已经变成了归还了...
  83. conn.close();
  84. } catch (SQLException e) {
  85. e.printStackTrace();
  86. }
  87. }
  88. }
  89. /**
  90. * 释放资源
  91. * @param stmt
  92. * @param conn
  93. */
  94. public static void release(ResultSet rs,Statement stmt,Connection conn){
  95. if(rs != null){
  96. try {
  97. rs.close();
  98. } catch (SQLException e) {
  99. e.printStackTrace();
  100. }
  101. }
  102. if(stmt != null){
  103. try {
  104. stmt.close();
  105. } catch (SQLException e) {
  106. e.printStackTrace();
  107. }
  108. }
  109. if(conn != null){
  110. try {
  111. // 把close()给修改了,原来是销毁连接,现在让方法变成归还连接。
  112. conn.close();
  113. } catch (SQLException e) {
  114. e.printStackTrace();
  115. }
  116. }
  117. }
  118. }
复制代码


回复

使用道具 举报