我希望使用单例模式实现DAL,但我认为连接池、事务等方面比较困难。
我想了解其优缺点,并想知道连接池的最佳方法,因为我正在开发的网站可能会有500多个并发用户。
数据库服务器是Oracle 10g。
DAL使用Enterprise Library 3.1。
我希望使用单例模式实现DAL,但我认为连接池、事务等方面比较困难。
我想了解其优缺点,并想知道连接池的最佳方法,因为我正在开发的网站可能会有500多个并发用户。
数据库服务器是Oracle 10g。
DAL使用Enterprise Library 3.1。
连接池最佳实践是不要自己实现,而是让 ADO.NET 框架来处理它。
您可以将连接池选项设置为连接字符串中的参数。然后,使用该字符串打开的每个连接都将从由框架实现和管理的连接池中提供。当您关闭或处理 OracleConnection 时,底层连接不会被销毁,而是会回到池中。
这在此处进行了描述: http://msdn.microsoft.com/en-us/library/ms254502.aspx
关于单例的使用:我已经用它们包装了数据访问层,并且一直运行良好。
请注意,事务仅适用于特定连接,而不是整个数据库。这意味着您可以运行多个线程,并且每个线程都可以通过独立事务读写数据库,只要每个线程使用单独的 OracleConnection 实例即可。
我不知道DAL是什么,但单例模式是一种很好的方法,可以使数据全局化,同时保持良好的封装性。
在数据访问层(DAL)中使用单例模式作为数据库连接工厂是相当常见的。它使您更轻松地插入不同的工厂实现,而无需改变大量代码。很多人似乎不喜欢单例模式,但我认为它对于这种类型的事情还是可以的。
我认为使用单例模式与否不会影响性能,因为您仍然可以在同一时间内运行多个线程。如果您注意不在所有线程中共享内部字段,那么一切都将正常工作。
最终,管理连接池的类需要是线程安全的,您最终会进行一些锁定,这可能会影响性能,但它们都是必需的。(它在框架内部制作,您无法改变其行为)
如果您决定不使用单例,请确保您的DAL实例很轻量级,因为这可能会有所不同,但通常不会。
注意:谈到连接池时,您必须注意遵循“尽可能晚地打开,尽早关闭”的模式。也就是说,在尽可能长的时间内延迟连接的打开,并在完成所有操作后尽快关闭它。
在使用此魔术规则构建整个系统之后,您可以尝试更改连接字符串参数以更改某些池选项(初始大小,最大大小等)
在使用单例模式处理数据访问层时,我有些不安。如果我想要使用多个数据库后端怎么办?也许我想在发票中使用MsSQL,但在身份验证中使用Active Directory。或者我想在论坛帖子中使用MySQL,但在地理聚类方面使用PostgreSQL(对我来说更现实,呵呵)。当我无法将模拟数据库连接传递给测试时,单例接口可能会使测试数据库层变得更加具有挑战性。