【ActiveJdbc】05
一、事务
通常在 Java ORM 中有一个显式连接或管理器对象(JPA 中的 EntityManager,Hibernate 中的 SessionManager 等)。
ActiveJDBC 中没有这样的对象。
下面是一个没有事务管理的最基本的 ActiveJDBC 应用程序示例:
public static void main(String[] args) {
Base.open("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/test", "the_user", "the_password");
Employee e = new Employee();
e.set("first_name", "John");
e.set("last_name", "Doe");
e.saveIt();
Base.close();
}
该调用Base.open()
打开一个连接并将其附加到当前线程。
所有模型的所有后续方法都重用此连接。、
该调用Base.close()
关闭连接并将其从当前线程中删除。
事务API
?到目前为止一切顺利,但要进行交易。
ActiveJDBC 确实提供了一些与事务相关的便利调用:
开始交易:
Base.openTransaction();
提交交易:
Base.commitTransaction();
并回滚:
Base.rollbackTransaction();
所有这些方法都简单地调用java.sql.Connection.setAutocommit(false)
,java.sql.Connection.commit()
并java.sql.Connection.rollback()
分别在 INFO 级别包装异常和记录事件。
正如您所看到的,ActiveJDBC 在这里并没有尝试做太多事情,只是想不碍事。
如果您需要更精细的控制,您可以获取当前连接并对其执行纯 JDBC 操作:
java.sql.Connection con = Base.connection();
con.setAutocommit(false);
...//or:
Base.connection().setAutocommit(false);
事务完整事例:
一个使用事务的简单程序如下所示:
public static void main(String[] args) {
try{
Base.open("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/test", "the_user", "the_password");
Base.openTransaction();
Employee e = new Employee();
e.set("first_name", "John");
e.set("last_name", "Doe");
e.saveIt();
Base.commitTransaction();
catch(Exception e){
Base.rollbackTransaction();
}finally{
Base.close();
}
}
和JNDI组合:
但是通常情况下,连接是从容器池中请求的,而事务配置已经由容器配置提供。
在这些情况下,用法是相同的(几乎),但您必须意识到某些调用可能不会成功,或者驱动程序可能会产生意想不到的副作用。
例如,如果您从池中请求连接,则事务可能会在那时开始,并且在您调用时:
Base.connection().setAutocommit(true/false);
,您可能会不小心提交正在进行的事务(?或者驱动程序将忽略您的调用并且什么也不做)。
ActiveJDBC 并没有在 J2EE 和 JDBC 已经提供的东西上添加任何特殊的东西。
以下是 MessageDriven Bean (JMS) 中使用的 ActiveJDBC 示例:
public void onMessage(Message m){
Base.open("myConnectionJNDIName");
TextMessage tm = (TextMessage)m;
String content = tm.getText();
String name = tm.getStringProperty("name");
try{
Article.create("name", name, "content", content).saveIt();
}
catch(Exception e){
ctx.setRollbackOnly(); // == this will send the message back into queue
}
finally{
Base.close();//always close connection
}
}
在上面的示例中,容器将管理事务。它将同时回滚:JDBC 和 JMS 事务。
二、IN条件的特殊处理
在某些情况下,您需要编写如下内容:
SELECT my_column FROM my_table where search_column IN (?)
不幸的是,JDBC 不支持此功能,因此我们有如下解决方法:Preparedstatement IN 子句替代方案/StackOverflow
IN
子句解决方法
解决方法很简单,如果你想执行这个:
String sql = "name IN ('John', 'Hellen', 'Henry')";
然后你用单引号和逗号加入这个列表:
List names = Collections.list("John", "Hellen", "Henry");
List<Person> people = Person.where("name IN ('" + Util.join(names, "', '") + "')");
您可以将此方法用于相对较小的列表,因为列表越大,生成的查询越长。每个数据库对查询的大小都有限制,因此您的里程可能会有所不同。
请参阅对Util#join和Collections#list方法的引用。这些类已经在每个 ActiveJDBC 应用程序的类路径上。
【ActiveJdbc】05的更多相关文章
- 【C】 05 - 声明和定义
仅从形式上看,C程序就是由各种声明和定义组成的.它们是程序的骨架和外表,不仅定义了数据(变量),还定义了行为(函数).规范中的纯语言部分,声明和定义亦花去了最多的篇幅.完全说清定义的语法比较困难,这里 ...
- 【二叉查找树】05根据升序的链表构造二叉查找树【Convert Sorted List to Binary Search Tree】
利用递归,构造二叉查找树, ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给一个 ...
- 【SpringCloud】05.Eureka的高可用
1.简单情况 2.为了达到Eureka的高可用,可以多个Eureka互相注册. 3.我们需要修改两处: Eureka Client Eureka Server 3.1 Eureka Client 在C ...
- 【SpringBoot】05.SpringBoot整合Listener的两种方式
SpringBoot整合Listener的两种方式: 1.通过注解扫描完成Listener组件的注册 创建一个类实现ServletContextListener (具体实现哪个Listener根据情况 ...
- 【scikit-learn】06:make_blobs聚类数据生成器
版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/kevinelstri/article/ ...
- 【博客美化】05.添加GitHub链接
博客园美化相关文章目录: [博客美化]01.推荐和反对炫酷样式 [博客美化]02.公告栏显示个性化时间 [博客美化]03.分享按钮 [博客美化]04.自定义地址栏logo [博客美化]05.添加Git ...
- 【WCF--初入江湖】05 WCF异步编程
05 WCF异步编程 一.服务设计最佳实践 在设计之初,是否用异步,应该由客户端来决定,而不应该去考虑服务的调用者调用的方式. 优点:充分利用多核CPU, 改善用户体验 缺点:滥用异步,会影响性能 二 ...
- 【FLUENT案例】05:DDPM模型
本例利用FLUENT的DDPM模型对提升管进行模拟. 1 介绍 本案例演示在FLUENT中利用稠密离散相模型(Dense discrete phase model,DDPM)模拟2D提升管.DDPM模 ...
- 【原创】开源Math.NET基础数学类库使用(05)C#解析Delimited Formats数据格式
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 【VB编程】05.MsgBox与InputBox函数
在VBA程序中,数据的输入输出是通过函数实现的,其实现的方式是通过对话框的形式表示出来的.例如MsgBox,Inputbox等,不要误认为是输入输出语句的关键字,其实仅仅是一个普通函数而已. [Msg ...
随机推荐
- Python中多线程的简单使用
from threading import Timer import time def run1(): print(1) print(2) print(3) def run2(): print(&qu ...
- this的二种使用方式
package com.ht.TestThis; public class TestThisKey { public static void main(String[] args) { // TODO ...
- INFINI Console 与华为鲲鹏完成产品兼容互认证
何为华为鲲鹏认证 华为鲲鹏认证是华为云围绕鲲鹏云服务(含公有云.私有云.混合云.桌面云)推出的一项合作伙伴计划,旨在为构建持续发展.合作共赢的鲲鹏生态圈,通过整合华为的技术.品牌资源,与合作伙伴共享商 ...
- MYSQL 连接数据库过程中发生错误,检查服务器是否正常连接字符串是否正确,错误信息:未将对象引用设置到对象的实例。
一: 中文提示 : 连接数据库过程中发生错误,检查服务器是否正常连接字符串是否正确,错误信息:未将对象引用设置到对象的实例.DbType="MySql";ConfigId=&quo ...
- 2 分钟,搞懂 SLO 最佳实践
本文是<SRE,Google运维解密>读书笔记,连载第三篇.微信公众号修改了推文逻辑,尤其是 iOS,建议对本公众号 SRETalk 加星标,以免错过后续系列推文. 本文介绍 SLO,曾经 ...
- 《Android开发卷——程序自动登录》
Android程序的自动登录功能 因为是公司的项目,所以这里不方便说出项目名称,这里就说我在做这个项目中用到的一些功能或者叫技术问题吧. 咱们经常用的Android程序中有一个情况,就是当你第一次注册 ...
- js金额格式化
function fmoney(s, n) //s:传入的float数字 ,n:希望返回小数点几位 { n = n > 0 && n <= 20 ? n : 2; s = ...
- es语法 rest api 模拟query 根据中文姓名搜索demo
es语法 rest api 模拟query 根据中文姓名搜索demo order_info_es/_doc/40094182abc GET order_info_es/_settings?pretty ...
- spring使用RedisCacheManager管理key的一些问题
spring可以很好地管理各种内存的快速缓存. 这些常见的内存缓存库实现方式有redis,Ehcache. 本文阐述的是redis,毕竟这个东西相当容易使用. spring通过 org.springf ...
- Freertos学习:05-内核控制
--- title: rtos-freertos-05-kernel-control date: 2020-06-22 11:10:19 categories: tags: - kernel - fr ...