SQL Server 和 HSQLDB 中使用 merge into 完成 saveOrUpdate 操作

当我们调用 Hibernate 的  saveOrUpdate() 或 JPA 的 save() 方法的 Hibernate 实现时,都会做两步操作:1)按 ID 查询记录是否已存在,2)不存在插入新记录,存在则更新原记录。这种两步操作其实可以在 SQL Server 和 HSQLDB 中一条语句完成,这就是本文要介绍的 merge into 语句。感觉到用数据库自己的特性,并且一条语句会比 saveOrUpdate() 两步操作性能要好,还需实测。

之所以把 SQL Server 和 HSQLDB 扯到一块来讲,是因为我们在实际项目中的单元测试是基于 HSQLDB 内存数据库的。merge into 如其名所示,它应该是给予我们便利的去根据把一个表中符合条件的记录合并到另一个表中去。我们这里只利用它的这特性去实现类似 Hibernate 的 saveOrUpdate() 操作。

假设我们有一个简单的表

CREATE TABLE user (
  id INT,
  name VARCHAR(32),
  address VARCHAR(128)
);

如果指 id 的记录已存在更新原来记录的 name 和  address, 不存在则插入新记录 阅读全文 >>

类别: Database, Hibernate. 标签: , . 阅读(38). 评论(0) »

SQLite 使用主键,ROWID 及自增列

之前关注过一些嵌入式数据库,倒时 SQLite 风头更劲,在 Android 上被应用,在 HTML5 中一些浏览器的 Local Database 的实现也是 SQLite。因在 PhoneGap 中使用数据库存储的选择也期待着它的表现,首先要建个数据库,第一要义就是主键的选择,自增列是最有效更简单的。

这里就看下 SQLite 怎么使用自动列,了解三个内容,ROWID, ROWID 的别名,自动列与序列表,归根结底它们都是 ROWID。

1. ROWID

每个表默认都有 rowid 列,除非创建表时指定了 WITHOUT ROWID, 它现在是 64 位长的。在查询时用 select * from table1 里没有它,要显式的用 select rowid, * from table1 就会列出它来。

2. ROWID 的别名 阅读全文 >>

类别: Database. 标签: , . 阅读(6,030). 评论(2) »

让 MySQL 在 Linux 下表名不区分大小写(实为表名全小写)

把 Windows 下的应用部署到 Linux 下,使用到了 Quartz 集群的特性,所以建了 MySql 的中间表,一启动看到报错:

Invocation of init method failed; nested exception is org.quartz.JobPersistenceException: Couldn't retrieve trigger: Table 'unmijob.QRTZ_TRIGGERS' doesn't exist [See nested exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'unmijob.QRTZ_TRIGGERS' doesn't exist]

用 MySQL 客户端连接到那个数据库,看到 qrtz_triggers 表确确实实是存在的,MySQL 也是安装在 Linux 下的。在大小写敏感的操作系统中,估摸着会不会是表名大小的因素呢? 于是把 qrtz_triggers 改为大写的 QRTZ_TRIGGERS,再次启动应用服务器,这时候出现的是: 阅读全文 >>

类别: Database. 标签: , . 阅读(2,229). 评论(0) »

安装 MySQL 5 后无法启动(不能 Start service) 的解决办法

安装的 MySQL 5.1.48 或是 MySQL 5.5.8,配置好最后点击 Execute 按钮了,但是进行不到 Start service 这一步。检查了下 MySQL 系统服务已添加,但是无法启动,手工也不行。这时候用事件查看器可以看到程序事件里有几个来自于 MySQL 的错误:

Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
Unknown/unsupported table type: INNODB

原来是因为这两版本的 MySQL 默认使用了支持事物的 INNODB 引擎,打开 my.ini 文件,在 MySQL 的安装文件夹, 如 c:\program files\MySQL\ 中,看到:

default-storage-engine=INNODB

解决办法是把该设置改为

default-storage-engine=MYISAM 阅读全文 >>

类别: Database. 标签: . 阅读(1,456). 评论(0) »

Logging tool for JDBC

jdbcdslog 是一款知名用来跟踪 JDBC 的全功能工具.

特征包括:
- 可挂接到数据库连接, 驱动或数据源上(XA, 连接池)
- 可记录 PreparedStatement 和 CallableStatement 调用所绑定的参数
- 可记录 ResultSet 对象中的查询记录行
- 可记录查询执行时间
- 支持多种日志引擎 (感谢 SLF4J, 你可以使用多数流行的日志组件库, 像 log4j, apache common logging, java logging 或者简单的输出到 System.out) 阅读全文 >>

类别: Database, Java/JEE. 标签: , . 阅读(55). 评论(0) »

了解NoSQL的必读资料汇总

前记:看到 Twitter 和 Digg 相继用 NoSQL 替代了原有的关系型数据库 MySql。显然,NoSQL 定然有它的许多优势,且目前已有相当的 NoSQL 产品实现,所以有必要对 NoSQL 表示一定的关注,故找些资料来看。它也是非关系型的数据库,那它与著名的文档型数据库 Domino 又有何种关系呢,Java 程序又该如何实际应用 NoSQL 呢?

NoSQL 的官网是:http://nosql-database.org/,里面有丰富的介绍
Wiki 百科上的条目:http://en.wikipedia.org/wiki/NoSQL。以及如下文字:

NoSQL 是非关系型数据存储的广义定义。它打破了长久以来关系型数据库ACID理论大一统的局面。NoSQL 数据存储不需要固定的表结构,通常也不存在连接操作。在大数据存取上具备关系型数据库无法比拟的性能优势。该术语在 2009 年初得到了广泛认同。 阅读全文 >>

类别: Database. 标签: , . 阅读(90). 评论(0) »

对SQL说不!NoSQL的数据库技术革命

在NoSQL运动的最新一次聚会中,来自世界各地的150人挤满了CBS Interactive的一间会议室。

就像当年波士顿的爱国者为反抗英国重税的行动一样,NoSQL的支持者们从各地涌来,分享他们如何推翻缓慢而昂贵的关系数据库的暴政,怎样使用更有效和更便宜的方法来管理数据。云计算可能会为数据库技术的发展带来新的契机,如果想在云中获得丰富而随需应变的可伸缩性,你需要一个非关系数据库。

“关系型数据库给你强加了太多东西。它们要你强行修改对象数据,以满足RDBMS (relational database management system,关系型数据库管理系统)的需要,”Java工具提供商SpringSource公司的首席工程师Jon Travis说,他是本次集会的10位发言人之一,在他看来,基于NoSQL的替代方案“只是给你所需要的”。 阅读全文 >>

类别: Database. 标签: , . 阅读(118). 评论(2) »

Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据

通常我们获取游标数据是用 fetch some_cursor into var1, var2 的形式,当游标中的记录数不多时不打紧。然而自 Oracle 8i 起,Oracle 为我们提供了 fetch bulk collect 来批量取游标中的数据,存中即是合理的。它能在读取游标中大量数据的时候提升效率,就像 SNMP 协议中,V2 版比 V1 版新加了 GET-BULK PDU 一样,也是用来更高效的批量取设备上的节点值(原来做过网管软件开发,故联想到此)。

fetch bulk collect into 的使用格式是:fetch some_cursor collect into col1, col2 limit xxx。col1、col2 是声明的集合类型变量,xxx 为每次取数据块的大小(记录数),相当于缓冲区的大小,可以不指定 limit xxx 大小。下面以实际的例子来说明它的使用,并与逐条取记录的 fetch into 执行效率上进行比较。测试环境是 Oracle 10g  10.2.1.0,查询的联系人表 sr_contacts 中有记录数 1802983 条,游标中以 rownum 限定返回的记录数。 阅读全文 >>

类别: Database. 标签: . 阅读(1,724). 评论(0) »

查询Oracle正在执行的SQL语句

支持左连接的 Oracle 9i 以上版本

select OSUSER, PROGRAM, USERNAME, SCHEMANAME, B.Cpu_Time, STATUS, B.SQL_TEXT
  from V$SESSION A
  LEFT JOIN V$SQL B ON A.SQL_ADDRESS = B.ADDRESS
                   AND A.SQL_HASH_VALUE = B.HASH_VALUE
 order by b.cpu_time desc

 Oracle 8i 及以前的版本中

select OSUSER, PROGRAM, USERNAME, SCHEMANAME, STATUS, B.SQL_TEXT
  from V$SESSION A, V$SQL B
 where A.SQL_ADDRESS = B.ADDRESS
   AND A.SQL_HASH_VALUE = B.HASH_VALUE

   --后面可以加上你要的约束条件
   and OSUSER = 'Unmi' AND USERNAME = 'APPS' and PROGRAM = 'JDBC-1.0-Client'

自行决定要查询出来的字段以及约束条件。

类别: Database. 标签: , , . 阅读(357). 评论(0) »

Oracle 存储过程中发送邮件,并支持用户验证、中文标题和内容

在 Oracle 的存储过程执行中,我们可能希望它本身能完成邮件发送执行的结果,特别是在捕获到了异常时。不能总是依赖于调用存储过程的外部程序--调用后,根据出口参数,发送执行结果。这一需求更迫切的表现在非人工参与的 Oracle Job 调用存储过程的情况下。

所幸,Oracle 为我们提供了发送邮件的工具包 UTL_SMTP,它最早出现在 Oracle 8.1.7 版本中。下面是我从网络上搜索相关资料后、综合整理、多处修正、数次调试、排除万难而写出的一个发送邮件的存储过程。可支持需用户验证的邮件服务器,中文标题和中文内容无乱码,只还未支持附件的发送,相信这方面应用较少,需要的话再 Google 一下,且文后参考中有相应的链接。 阅读全文 >>

类别: Database. 标签: , . 阅读(399). 评论(0) »
Page 1 of 41234