星期六, 一月 03, 2009

Java程序使用OCI驱动连接Oracle数据库


2008年04月23日 星期三 上午 11:25

今天在群里听到老师说到oracle驱动thin的性能比oci差了好多,发现oci从没听说过。。。找点资料过来

仔细看了下面才知道,原来以前也下载过即时客户端,只不过没有深入研究下 去。

================================================================================================================

  Java程序连接oracle数据库时,用oci驱动要比用thin驱动性能好些。主要的区别是使用thin驱动时,不需要安装oracle的客户端,而使用oci时则要安装oracle的客户端。
  从使用thin驱动切换到oci驱动在配置来说很简单,只需把连接字符串java:oracle:thin:@hostip:1521:实例名换为java:oracle:oci@本地服务名即可。如:
  从
  jdbc:oracle:thin:@10.1.1.2:1521:shdb
  改成
  jdbc:oracle:oci:@shdb
  但这里这台机需安装oracle数据库的客户端并配置本地服务名,同时还需指定 NLS_LANG环境变量,NLS_LANG环境变量是用来控制客户端在显示oracle数据库的数据时所用的字符集和本地化习惯。通常把 NLS_LANG的字符集部分指定为数据库所用的字符集则就不会存在java显示的乱码问题了。
  对于oracle数据库客户端的安装,有二种选择,一是老实的用oracle数据库的安装光盘安装对应版本的oracle客户端。二是下载oracle提供的即时客户端,即时客户端是不用安装的,把下载包解压即可。
  要使java web正常的通过oci驱动访问oracle,还需要客户端正确的配置一下相关变量。主要如下:
  对于windows系统并使用oracle客户端时:
  1. 把%ORACLE_HOME%\lib加到PATH环境变量。
  2. 把%ORACLE_HOME%\jdbc\lib\classes12.jar加到CLASSPATH环境变量里。也可以把classes12.jar拷贝到tomcat的comman\lib目录下。
  对于windows系统并使用oracle的即时客户端时(假定即时客户端解压在d盘):
  1. 把d:\instantclient_10_2加到PATH环境变量
  2. 把d:\instantclient_10_2\classes12.jar加到CLASSPATH环境变量里。也可以把classes12.jar拷贝到tomcat的comman\lib目录下。
  对于linux系统并使用oracle客户端时:
  1. 在使用tomcat的用户主目录下的。bash_profile文件中加入
  exprot ORACLE_HOME=/u01/app/oracle/product/9.2.0.4
  export LD_LIBRARY_PATH=$ORACLE_HOME/lib
  2. 把classes12.jar拷贝到tomcat的comman\lib目录下。
  对于linux系统并使用oracle即时客户端时:
  1. 在使用tomcat的用户主目录下的。bash_profile文件中加入
  exprot ORACLE_HOME=/instantclient_10_2
  export LD_LIBRARY_PATH=$ORACLE_HOME/lib
  2. 把instantclient_10_2目录下的classes12.jar拷贝到tomcat的comman\lib目录下。
  如果一个tomcat下带了几个应用,且几个应用都要连接oracle数据库时,则要注意的时,不要在每个应用的WEB-INF/lib目录下放入 oracle的classes12.jar/zip文件。而应该把classes12.jar/zip文件放到tomcat的common/lib目录 下。否则会出来ojdbclib9/10库重复加载的错误。
  使用oracle即时客户端是,本地服务名的建立可以在目录instantclient_10_2下建立tnsnames.ora下添加连接串,如:
  SHDB =(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.236)(PORT = 1521)))
  (CONNECT_DATA =(SERVICE_NAME = shdb)))

星期二, 十二月 02, 2008

FreeDNS


FreeDNS
208.67.222.222
208.67.220.220

星期五, 八月 08, 2008

vb.NET下获取命令行参数的方法

命令行参数允许用户或其他程序向程序传送启动信息。例如:程序名为test.exe,可以运行以下命令:
test.exe /help
在VB6中,可以使用Command属性读取它。在Vb.NET中,它已替换为System.Environment.GetCommandLineArgs函数,该函数返回一组传送的启动参数。
代码如下:
Dim myArg() As String, iCount As Integer
myArg = System.Environment.GetCommandLineArgs
For iCount = 0 To UBound(myArg)
TextBox1.Text = TextBox1.Text & "|" & myArg(iCount).ToString
Next

我的用法如下:
Imports System.Windows.forms
Module Module1

Sub Main()
Dim myArg() As String
Dim icount As Integer
myArg = System.Environment.GetCommandLineArgs
For icount = 0 To UBound(myArg)
MessageBox.Show(myArg(icount).ToString)
Next

End Sub

End Module
运行通过

星期六, 八月 02, 2008

用 vb.net 读写 ini 文件

Public Class Form1
' 这个有点不明白,为什么要这么做,
' 个人感觉都不如 xml 好用。
' 以后再研究
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As String, ByVal lpdefault As String, _
ByVal lpretrunedstring As String, ByVal nSize As Int32, _
ByVal lpFilename As String) As Int32

Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As String, ByVal lpString As String, _
ByVal lpFilename As String) As Int32


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
WritePrivateProfileString("AppName", "KeyB", "MyValue", "C:\a.ini")
WritePrivateProfileString("Port", "value", "11024", "c:\a.ini")

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim strIni As String
strIni = New String(" ", 100)
GetPrivateProfileString("AppName", "KeyB", "", strIni, 100, "c:\a.ini")
MsgBox(strIni)
End Sub
' vb.net 中读写 ini 文件和 vb6 中的做法是一致的,也要使用 Windows Api 的方法
' 唯一要注意的是:在 vb.net 中,api 声明中的 Long 型要改为 int32 类型。
End Class

用 VB.net 编写 Socket 通信程序

服务器端:

Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.Threading

Public Class Form1
Dim s As Socket = Nothing
Dim t As Thread
' 新建一个线程,用于处理收到的Socket 数据包
Public Sub WaitData()
' 使用 TCP 协议
s = New Socket(AddressFamily.InterNetwork, _
SocketType.Stream, ProtocolType.Tcp)
' 定义 IP 和端口
Dim localEndPoint As New IPEndPoint(IPAddress.Parse("127.0.0.1"), 11024)
' 绑定到该 Socket
s.Bind(localEndPoint)
' 侦听,最多接收10个连接
s.Listen(10)
While (True)
' 用来储存接收到的字节
Dim bytes(1024) As Byte
' 若接收到,则创建一个新的 Socket 与之连接
Dim ss As Socket = s.Accept()
MessageBox.Show("ss connected = " & ss.Connected.ToString)
' 接收数据,若用 ss.send(byte()), 则发送数据
ss.Receive(bytes)
' 将其插入到列表的第一项之前
' 以下用法会弹出不安全线程访问错误
'ListBox1.Items.Insert(0, Encoding.Unicode.GetString(bytes))
' 对不带参数的方法的委托
Dim strGetS As String
strGetS = Encoding.Unicode.GetString(bytes)
BeginInvoke(New EventHandler(AddressOf AddInfo), strGetS)
' 若使用 Encoding.ASCII.GetString(bytes), 则接收到的中文字不能显示
End While
End Sub
Private Sub AddInfo(ByVal sender As Object, ByVal e As EventArgs)
ListBox1.Items.Insert(0, "消息>>> " & sender.ToString)
End Sub


Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
' btnStart 的 click 事件中,加入如下代码:
' 建立新的线程
t = New Thread(AddressOf WaitData)
' 启动线程:
t.Start()
' 按钮不可用,避免另起线程
btnStart.Enabled = False
End Sub

Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click
' 在BtnStop的click事件中, 加入如下代码
Try
' 关闭 Socket
s.Close()
' 终止线程
t.Abort()
Catch ex As Exception
MessageBox.Show(ex.ToString)
Finally
' 启用按钮
btnStart.Enabled = True
End Try
End Sub

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
' 为了防止用户不点击Stop直接退出,而不能使线程结束,则应在窗体的closing事件中,加入如下代码:
Try
s.Close()
t.Abort()
Catch ex As Exception
MessageBox.Show(ex.ToString)

End Try

End Sub
End Class


客户机端:
Imports System.Net
Imports System.Net.Sockets
Imports System.Text

Public Class Form1

Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click
Try
Dim bytes(1024) As Byte
Dim s As Socket
s = New Socket(AddressFamily.InterNetwork, SocketType.Stream, _
ProtocolType.Tcp)
Dim localEndPoint As New IPEndPoint(IPAddress.Parse("127.0.0.1"), 11024)
s.Connect(localEndPoint)
If Not s.Connected Then
Dim strRetPage As String = "无法连接到远程主机"
MessageBox.Show(strRetPage)

Else
MessageBox.Show("s.Connected is " & s.Connected.ToString & vbCrLf)
s.Send(Encoding.Unicode.GetBytes(TextBox1.Text))
s.Close()

End If
Catch ex As Exception
'MessageBox.Show(ex.ToString)
MessageBox.Show("错、错、错")
End Try

End Sub
End Class


(完)