使用Java读取Mysql数据的编码问题

使用 java 程序对 Mysql 数据库内数据进行操作,如果使用默认字符集时数据库连接串通常为:
 
db.url=jdbc:mysql://192.168.0.137/test?user=root&password=&autoReconnect=true&useUnicode=true
      
去掉设置:&characterEncoding=utf-8
 
此时使用的字符集为:ISO-8859-1。因此,插入数据库中的数据会被 Mysql 驱动转换成默认编码:ISO-8859-1。整个数据库中的数据本身不会有什么问题,使用 Mysql 查看的时候看到的是一些问号。但是如果使用 Java 读取这些数据的时候,如果要正确显示,则需要对其进行正确的编码:
  • 使用系统默认的编码方式:
                插入时:直接给定参数 stringValue ,此时 stringValue 为JVM默认编码
               插入后:数据库中 stringValue 值的编码为 ISO-8859-1
               读取时:使用 stringValue = new String(stringValue.getBytes(“ISO-8859-1”));进行将编码ISO-8859-1 转换成操作系统的默认编码(GBK)。
  • 上述过程完整描述为:
           
    插入时:直接给定参数 stringValue = new String(stringValue.getBytes(), “ISO-8859-1”);
    插入后:数据库中 stringValue 值的编码为 ISO-8859-1
    读取时:使用 stringValue = new String(stringValue.getBytes(“ISO-8859-1”));进行将编码ISO-8859-1 转换成操作系统的默认编码(GBK)。
  • 采用硬编码形式又可以写成:
           插入时:直接给定参数 stringValue = new String(stringValue.getBytes(“GBK”), “ISO-8859-1”);
          插入后:数据库中 stringValue 值的编码为 ISO-8859-1
          读取时:使用 stringValue = new String(stringValue.getBytes(“ISO-8859-1”), “GBK”);进行将编码ISO-8859-1 转换成操作系统的默认编码(GBK)。
345 次阅读

Singleton模式在多线程实现下的误区

今天使用多线程的方式写一个程序。非常不幸,碰到了死锁问题,最终发现:单例对象的创建时必须保证是同步的,否则多线程高并发情况下,可能创建出多个对象。并且导致错误。

以前写单例对象时使用的是下面的错误的写法:

public static SomeObject getInstance()
{
if (instance == null)
instance = new SomeObject();
return instance;
}

于是在多线程高并发的情况下,public static SomeObject getInstance()方法由于没有同步,被两个线程同时进入,这时候 instance 被创建两次。虽然最终instance对象只会保持有一个(因为只有一个对象句柄),但在这两个对象创建到销毁的一小段时间里边,就有可能发生死锁这样的情况。

所以一定要注意,创建Singleton对象时进行同步。另外考虑到public static SomeObject getInstance()可能是调用最频繁的,所以可以不加锁,只在创建方法上加锁。于是Singleton模式在多线程方式下,应当这样写:

public static synchronized SomeObject createInstance()
{
if (instance == null)
instance = new SomeObject();
}

public static SomeObject getInstance()
{
if (instance == null)
createInstance();

return instance;
}

这样在createInstance()不会被创建多个对象。

:)希望大家都很幸运,不会像我这样碰上这种让人郁闷的错误。

374 次阅读

Java 5

今天终于安装上Java 5正式版,试用了一下,感觉相当不错。速度比1.4快了许多,最重要的是没有了beta版本的不兼容问题(特别是 java.util.StringBuffer类)。旧程序不用经过编译就可以直接运行,这就已经相当方便了。Sun这次做的这么好,真的很让人惊奇。

最近也看了一系列的Java5和.Net2的比较文章,总的来说两者性能和界面相差不多。Java在人机交互、桌面应用方面和.net有一些差 距,而.net在多线程和企业级架构方面又稍为逊色。但是,对于微软的应用,我仍然存在一些心理上的阴影,几乎所有微软的产品,或多或少都有许多未公开的 特性(Windows, Office产品系列),使得程序员深入下去极为困难。而Java体系基本是开源的,JDK的源代码也可以很容易得到。

已经习惯了碰到一个问题时,直接跟踪到JDK的源代码一窥究竟。恩,还是喜欢开源多一些。

另外,在桌面开发上,如果能够将Delphi的VCL思想应用到Java当中,配合IDE,那么方便快捷的Java桌面开发,未尝不是不可能的事情。

85 次阅读