Java堂  


微软官方发布SQLServer JDBC 1.1 CTP版本

Filed under: Database — Jet @ 11:38 下午
原文出处: 微软官方发布SQLServer JDBC 1.1 CTP版本
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

经过漫长的6个月的等待,微软官方终于发布了SQL Server JDBC 1.1版本的驱动,不过该版本为CTP(Community Technology Preview) 社区预览版,主要修改了所有已知的bug。
这里引用SQL Server JDBC项目一名开发人员 Angel 的一段说明:

Announcing the June 2006 Community Tech Preview of the JDBC 2005 driver:
http://www.microsoft.com/downloads/details.aspx?familyid=f914793a-6fb…

This preview contains all the changes of CTP 1 including Integrated
Security, it includes rollup fixes for all the QFEs we have shipped to date
and we have addressed most customer issues filed through the product
feedback center.

To round it off we have also added a brand new feature: Client Failover. As
far as I know this is the first JDBC driver to take advantage of Sql Server
2005 Database Mirroring. This feature has been fully documented for this
CTP, we could really use feedback on both the functionality and the docs.

For a complete change list take a look at the release.txt file that ships
with the package, for the first time we are providing comprehensive
information on the work we have done since v1.0, let us know if this is
helpful information.

下载地址:http://msdn.microsoft.com/data/ref/jdbc/

安装SQL Server2005遇到的几个问题

Filed under: Database — Jet @ 11:20 上午
Tags:
原文出处: 安装SQL Server2005遇到的几个问题
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

原来有个项目是SQL Server2000,想移植到最新的2005中。手头得到的是一个2005企业版,安装的时候遇到了几个问题,现在一一列出来希望对大家有所帮助。
1. “系统兼容性”警告
在执行到系统检测那一步的时候有一个警告,提示是“系统兼容性错误”,因为是一个警告,当时也没有在意就继续安装了。但是安装的时候只有一个客户端可以选择,不能安装sql server服务。后来没办法,又重新回到刚才的警告,自己看了下“安装帮助”,原来企业版只能运行在win2k server和2003等系统上,不能运行在XP上。这一点跟之前的2000是类似的。所以本机只能安装标准版的了。

2. 性能计数器要求安装错误
提示的对话框如下:
查看了联机帮助,提示下面的解决办法(这个方法我试了之后不是很好,另外一个方法见下面):

1 在 Microsoft Windows 2003 或 Windows XP 桌面上,依次单击“开始”、“运行”,然后在“打开”中键入 regedit.exe,再单击“确定”。在 Windows 2000 中,使用 regedt32.exe 启动注册表编辑器。

2 定位到以下注册表项:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib]

“Last Counter”=dword:00000ed4 (5276)

“LastHelp”=dword:00000ed5 (5277)

3 上一步的“Last Counter”值 (5276) 必须与以下注册表项中“Perflib\009”的“Counter”项的最大值匹配,并且上一步的“Last Help”值 (5277) 必须与以下注册表项中“Perflib\009”的“Help”项的最大值匹配。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009]

注意 009 是英文中的一个示例。“Last Counter”和“Last Help”值是由 Windows 动态分配的;这两个值会因计算机的不同而不同。

4 如有必要,可修改“\Perflib”项中的“Last Counter”和“Last Help”值的值:在右侧窗格中,右键单击“Last Counter”或“Last Help”,单击“修改”,再单击“Base = “Decimal””,在“值数据”中设置值,再单击“确定”。如有必要,对另一个项重复以上过程,然后关闭注册表编辑器。

5 再次运行 SQL Server 安装程序。

可是按照上面的方法还是无法解决问题,后来网上查了下,找到一个解决的办法(见下面的参考资料)。不过其实没有作者介绍的那么复杂,只要在[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib] 找到04项下Count和Help中最大的项值(一般是最后一项)修改到Perflib目录下对应的“Laster Counter”项和“Laster Help”项就可以了。

3. SQL Server2005与SQL Server2000或SQL Server7.0共存的方法
因为都是在本机,安装2005的时候原来的SQL Server2000也不想删除,查了下资料这样是可以的,需要注意以下两点:
1) 在安装SQL2005的时候不要使用默认实例名称(SQL Server2000的实例名称是MSSQLSERVER),手工输入一个自定义的不同于MSSQLSERVER的实例名称;
2) 如果和SQL Server2000安装到同一目录(例如C:\Program Files\Microsoft SQL Server),那么在安装时不要选择安装SQL Server Management Studio,而是在安装之后到光盘的Tools\Setup目录下,运行SqlRun_Tools.msi安装。如果不小心已经安装上的话,在“添加/删除”里面删除掉SQL Server Management Studio然后在到光盘的Tools\Setup目录下,运行SqlRun_Tools.msi重新安装就可以了。

参考资料:
安装Ms SQL Server 2005 开发版时出现性能计数器要求安装错误的解决办法
http://submaie.cnblogs.com/archive/2006/02/07/326538.html
SQL Server2005与2000能否装在同一个系统?求确切答案
http://www.readbook8.com/dev/5701/4402802.htm

Oracle中的”值和null以及java中的null区别

Filed under: Database — Jet @ 11:24 上午
Tags:
原文出处: Oracle中的”值和null以及java中的null区别
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

关于三者的区别,我做了一个实验,下面是JUnit的代码片断:

  1. public void testInsert(){ 
  2.         Connection conn = null;
  3.         try{ 
  4.             conn = dbPool.getConnection();
  5.             assertNotNull(conn);
  6.             // sql script
  7.             String sql;
  8.             sql = "INSERT INTO TEST (Note, Name) Values ('''''', '')";
  9.             //sql = "INSERT INTO TEST (Note, Name) Values ('Oracle NULL', NULL)";
  10.             //sql = "INSERT INTO TEST (Note, Name) Values ('Java null', " + null + ")";
  11.             //sql = "INSERT INTO TEST (Note, Name) Values ('Java null string', '" + null + "')";
  12.             Statement stmt = conn.createStatement();
  13.             stmt.executeUpdate(sql);
  14.         } catch(Exception e){ 
  15.             fail(e.getMessage());
  16.         } finally{ 
  17.             if(conn != null) 
  18.                 try { conn.close();} catch (SQLException e) {} 
  19.         } 
  20.     }

依次执行上面代码中的四个sql语句,然后打开SQL*Plus,执行查询

  1. select id from test where name is null;

结果:

Note Name
——————————————————————————–

Oracle NULL
Java null

执行

  1. select id from test where name is not null;

结果:

Note Name
——————————————————————————–
Java null string null

ORA-00600: internal error code, arguments: …

Filed under: Database — Jet @ 2:37 上午
Tags:
原文出处: ORA-00600: internal error code, arguments: …
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

今天运行Java程序的时候出现了一个非常奇怪的异常信息: “ORA-00600: internal error code, arguments: …”,具体也不知道什么原因,查了下资料,据说是Oracle的bug。解决的方法也很简单,重启下Oracle就可以了。

Oracle 9i

使用Enterprise Manager Console操作Oracle 9i

Filed under: Database — Jet @ 1:44 下午
Tags:
原文出处: 使用Enterprise Manager Console操作Oracle 9i
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

Enterprise Manager Console是Oracle 9i所提供的一个用来操作Oracle数据库的图形化工具,在10g中以Web程序的形式发布,其操作与9i大多是相同的。现在总结下使用Enterprise Manager Console对Oracle所进行的基本操作管理方法。
1. 表空间管理
表空间(Tablespace)是Oracle用于物理存储的结构。表空间存储段的集合-表和索引。同时,表空间是Oracle数据库中数据的逻辑组织。一个表空间在操作系统级映射到一个或多个数据文件上去。
2. 用户管理
启动一个数据库,在“安全性”-“用户”上右键,选择“创建”打开“创建用户”对话框。名称中输入用户名,口令中输入密码,其他都设置默认值,然后点击“创建”按钮。这样系统在创建用户的同时将创建一个同名的表空间和方案。
3. 表管理
表必须存在于一个“方案”中,所以创建表的时候在“方案”-“表”中选择一个已经存在的方案,然后右键选择“创建”打开“创建表…”对话框。在名称中输入表的名称,如果选择“定义列”的话,可以在下面同时创建表中的列(字段)。
在“方案”中选择指定的表,然后右击选择“表数据编辑器”打开“表编辑器”对话框,可以从中查看和编辑表中的数据。
4. 索引管理
因为索引于表是相对应的,所以索引也必须存放在一个“方案”之中。选择“方案”-“索引”,然后在其中选择一个方案,右键选择“创建”打开“创建索引”对话框。在名称中输入索引的名称

拿到了SQL Server JDBC V1.1 CTP驱动

Filed under: Database,JavaPlateform — Jet @ 11:29 下午
原文出处: 拿到了SQL Server JDBC V1.1 CTP驱动
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

目前微软官方提供的SQL Server JDBC的最后版本为1.0,但是该版本的驱动有许多bug,今天得到的这个1.1版本的驱动是微软JDBC小组内部发行的一个版本,解决了许多已知的bug,比如:

Bug Details: Statement.execute() returns incorrect results for stored procedures

http://lab.msdn.microsoft.com/ProductFeedback/viewfeedback.aspx?feedbackid=dc43eb80-69b5-4137-8671-9f4e813ce259

Bug Details: JDBC 2005 GA Driver error when running a callablestatement on SQLServer 2000

http://lab.msdn.microsoft.com/ProductFeedback/viewFeedback.aspx?feedbackid=3fcf439d-79ed-44d9-bbbf-320e4ee25d89

Exception Message: “SQL Error: A server cursor is not allowed on a remote stored procedure or stored procedure with more than one SELECT statement. Use a default result set or client cursor”

Bug Details: JDBC Driver executeBatch does not work with INSERT statement

http://lab.msdn.microsoft.com/ProductFeedback/viewFeedback.aspx?feedbackid=e13a8009-7466-4803-ba19-6bfd4b5f8966

Exception Message: “java.sql.BatchUpdateException: com.microsoft.sqlserver.jdbc.SQLServerException: sp_cursoropen/sp_cursorprepare: The statement parameter can only be a single select or a single stored procedure.“

Bug Details: SQL2005 JDBC Driver bug with time zone handling **Available as a QFE**

http://lab.msdn.microsoft.com/ProductFeedback/viewFeedback.aspx?feedbackid=e73c8b79-53a6-4779-98f1-71c0043179eb

如果需要的可以在下面留言。
现在微软官方已经推出了新的正式版的1.1版本的驱动,大家可以在官方下载:http://msdn.microsoft.com/data/ref/jdbc/

SQL Server JDBC 1.0 中关于executeBatch()方法的两个bug

Filed under: Database — Jet @ 4:08 下午
原文出处: SQL Server JDBC 1.0 中关于executeBatch()方法的两个bug
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

SQL Server JDBC的bug真是多多啊, 今天又发现两个很奇怪的错误, 查了网上的一些资料, 果然是驱动的bug. 情况是这样的:
将SQL Server JDBC的连接字段中SelectMethod设置为cursor, 然后执行下面一段代码:

  1. PreparedStatement stmt = connection.prepareStatement("insert into table1
  2. values (?, ?)");
  3. stmt.setInt(1, 1);
  4. stmt.setInt(2, 2);
  5. stmt.addBatch();
  6. stmt.executeBatch();
  7. stmt.close();

这个时候会产生 “sp_cursoropen/sp_cursorprepare: 语句参数只能是单个 SELECT 语句或单个存储过程。” 的SQLServerException, 同时数据不能写入到数据库中.
第二个错误是使用CallableStatement调用SQL Server的存储过程的时候, 如果使用executeBatch()方法的时候, 数据不能进行写入或更新, 并且没有抛出任何的异常.
查了一下微软的bug中心, 发现以上两个错误果然是JDBC的bug.
Bug Details: JDBC Driver executeBatch does not work with INSERT statement
http://lab.msdn.microsoft.com/ProductFeedback/viewFeedback.aspx?feedbackid=e13a8009-7466-4803-ba19-6bfd4b5f8966
Bug Details: Statement.execute() returns incorrect results for stored procedures
http://lab.msdn.microsoft.com/ProductFeedback/viewfeedback.aspx?feedbackid=dc43eb80-69b5-4137-8671-9f4e813ce259

bug记录上面显示状态为fixed, 但是对外公开的最新的驱动还没有更新, 只能是耐心的等待了 :(

参考资料:
Batch inserts dont work with PreparedStatement and selectMethod=cursor
http://groups.google.com/group/microsoft.public.sqlserver.jdbcdriver/browse_thread/thread/97b17f5b551ad146/385a82eb5315dccc?q=Batch+inserts+dont+work+&rnum=1

一篇专门介绍SQL Server JDBC的教程《MS_SQLSERVER.JDBC 》

Filed under: Database,JavaPlateform — Jet @ 3:48 下午
原文出处: 一篇专门介绍SQL Server JDBC的教程《MS_SQLSERVER.JDBC 》
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

市面上关于JDBC的介绍大多是关于Oracle或MySQL的, 而关于SQL Server JDBC的资料不是很多. 昨天从网上找到一篇专门介绍SQL Server JDBC的文章, 虽然是内容是关于JDBC2000的, 但是现在最新的SQL Server JDBC1.0对旧版本的改变大多是修改许多bug, 外部的API用法或者名称改变的不多, 所以这篇教程依然是一个非常好的参考资料.

教程原地址: http://www.csuchico.edu/computing/JAVAINFO/MS_SQLSERVER.JDBC/Preface.html

为方便大家, 我将其做成了chm格式的文档. 可以在本地下载.

SQL Server JDBC 1.0中提高Select的效率

Filed under: Database — Jet @ 3:00 下午
原文出处: SQL Server JDBC 1.0中提高Select的效率
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

如下一段代码, 其中myArray为一个存储数据的数组:

  1. // 建立Connection
  2. for(int i = 0; i < myArray.length; i ++){ 
  3.     link = myArray[i];
  4.     if(link == null) 
  5.         continue;
  6.     else 
  7.         link = link.replaceAll("'", "''");
  8.     String query = "Select Top 1 a_id From _osd_article Where link='" + link + "'";
  9.     Statement s = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
  10.     ResultSet rs = s.executeQuery(query);
  11.     boolean have = rs.next();
  12.     rs.close();
  13.     s.close();
  14.     if(have) 
  15.         continue;
  16. } 
  17. // 释放Connection...

执行之后发现Select的速度非常的慢, 并且在执行的过程中出现CPU使用率100%的情况. 查阅了一些资料, 原来是由于SQL Server JDBC 1.0默认的SelectMethod为direct造成的. 在direct模式下, 每一个Connection必须只对应一个Statement, 所以在查询的时候系统资源占用非常的高; 另外, direct模式下也容易产生互锁的事务. 如果修改为cursor模式就可以了. 关于驱动连接的参数以及详细的说明可以见参考资料.

参考资料:
Why is com.microsoft.jdbc.sqlserver.S-QLServerDriver so slow?
http://groups.google.com/group/microsoft.public.sqlserver.jdbcdriver/browse_thread/
thread/c11b52262f313bcb/c293b3aef59bb71a?q=select+slow&rnum=2

(SQL Server JDBC) Connection String Properties
http://www.csuchico.edu/computing/JAVAINFO/MS_SQLSERVER.JDBC/jdbcsqlsrv3.html
JDBC连SQL SERVER数据库常见问题
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=123&threadID=18621

JDBC优化技巧 – Performance Tips for the Data Tier (JDBC)

Filed under: Database,JavaPlateform — Jet @ 6:41 上午
Tags:
原文出处: JDBC优化技巧 – Performance Tips for the Data Tier (JDBC)
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

今天发现一篇非常棒的关于JDBC优化的文章, 题目名为《Performance Tips for the Data Tier (JDBC)》,中文翻译成《JDBC优化技巧》。
英文版地址:http://www.theserverside.com/articles/article.tss?l=JDBCPerformance
我发现一位名为陈先波的网友已经将其翻译成了中文,大家也可以参考下:http://blog.csdn.net/turbochen/archive/2004/06/13/8107.aspx

最后,我将这两个版本合而为一, 做了一个chm格式的文件,方便大家的查询使用。文件下载

« 上一页下一页 »