大家来讨论下单例模式, JDBC 和数据库连接池

2016-05-15 22:34:59 +08:00
 onice

我最近在学习 Java Web ,复习到 JDBC 这一块了。

项目里有一个 DBManager 的类,里面使用单例模式提供了一个获取数据库连接和关闭数据库连接的方法。

一直想不明白,为什么要使用单例模式?如果项目的全局范围中,只有一个数据库连接可用,那么当多个操作需要同时访问数据库该怎么办?

使用单例模式的情况下,如果两个用户同时登录,那么两个用户各需要一条数据库连接,但数据库连接只有一条。在单例模式的代码块中两个线程同时返回同一条数据库连接,这样不是违背常理了?项目中也没有实现类似队列的功能,并发的情况下多个数据操作共用一条数据库连接也可以?

数据库连接池能解决上面这个问题,但依然感觉有瓶颈。例如设置连接池最大开启 10 条连接。在并发的情况下,允许十个用户同时操作数据库。在连接不被释放的情况下,第十一个用户依然需要等待,一直要等到前面十个用户之一把数据处理完,让连接释放出来,这样连接池中才有空闲的链接。

还有,我使用 Hibernate 的时候,发现 Hibernate 把数据库里面的内容映射成了实体类。书上用 JDBC 操作数据库的时候也会把数据库的内容封装为 JavaBean 。我觉得不用 JavaBean 也可以啊,直接封装到 List<Map<String,Object>>里面也行。 ORM 的好处难道仅仅是为了操作方便?

之前学习是带着能做项目的目的去学习的,现在复习起来开始深究,,发现自己好多地方想不通。还望各位前辈指点。

5858 次点击
所在节点    Java
3 条回复
crazyxin1988
2016-05-15 23:08:38 +08:00
连接池的意义在于:
1. 限制连接的无限增长,因为无限增加,系统必然挂掉。
2. 复用连接,节约资源

还有 代码可运行 与 代码可扩展并且可维护 是两码事,等你工作了就感受 ORM 必要性了
Presageee
2016-05-15 23:08:42 +08:00
1.单例模式不合理,多线程使用事务会出问题,如果需要使用单例模式,则需要对使用到数据库连接的地方手动加锁
2.连接池一般都够用,数据库出现瓶颈的时候还有多种方法解决,比如缓存,读写分离等
3.orm 就是对象关系映射,实际上我基于个人理解实现的 orm 框架就是通过反射获取字段等进行类型转换将 resultset 转换成对象,使用 javabean 这样方便操作,可读性也强。你想想假如你有 10 个表需要映射,你觉得是 10 个 pojo 类看着舒服方便还是 10 个 List 呢
broadliyn
2016-05-15 23:15:18 +08:00
1.单例模式的单例指的是数据库连接池对象,而不是单个连接对象。多个线程公用一个连接对象肯定会有问题。
2.的确是这样,第 11 个就要等待前边的资源释放。碰到这样的问题,就需要做本地缓存、数据库分库分表分布式集群。
3.可以直接返回 Map ,但是 ORM 的好处在于,如果一个表字段很多, insert 、 update 语句会很长,在表增、改、删字字段的时候,所有的这些 SQL 都要一起修改,如果遗漏这些语句,运行时就会报错。使用 Hibernate 的好处不仅是在于 update 、 insert 、 ORM 这方面方便,一个 JavaBean 做了 @Entity 关联以后,应用程序在启动过程中 hibernate 会去检查相关的 bean 字段是否和数据库中匹配,如果发现不匹配,那么在启动过程中就会直接报错,而不是等线上运行时才报错。另外用 Map 的形式,你获取一个字段的值,肯定用 map.get("columnXX"),get()参数是一个字符串,如果里边对应的字段名改了,那么这段代码只能到运行的时候才能爆出字段错误的异常,而实用 Hibernate ,你改了字段名,在编译器你就能发现这些错误。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/278826

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX