【symfoware NATIVE】數據庫應用

Symfoware  NATIVE系

【共通】
應用程序開發環境
開發語言            操作數據庫方法
  C                   SQL嵌套
  C++                 ODBC
  C#                  .NET Framework
  COBOL               SQL嵌套、ODBC、.NET Framework
  Java                Java
  Visual Basic        ODBC
  Visual Basic .NET   .NET Framework、ODBC

Windows系統中使用以下平臺,新手也容易理解程序開發。   
Interstage Studio
- COBOL(SQL嵌套、ODBC)
- Java(Java)
Visual Studio
- C(SQL嵌套)
- C++(ODBC)
- C#(.NET Framework)
- COBOL(.NET Framework)
- Visual Basic(ODBC)
- Visual Basic .NET(ODBC、.NET Framework)


數據檢索
SELECT DISTINCT name, num INTO :PRODUCT, :WHCODE
FROM db1.table1 WHERE num < 120
注意:
:PRODUCT表示PRODUCT變量,
INTO :PRODUCT表示將name賦值給PRODUCT(這種方式只能在嵌入SQL中使用)。


使用cursor操作
遊標是SQL的一個內存工作區,由系統或用戶以變量的形式定義。遊標的作用就是用於臨時存儲從數據庫中提取的數據塊。在某些情況下,需要把數據從存放在磁盤的表中調到計算機內存中進行處理,最後將處理結果顯示出來或最終寫回數據庫。這樣數據處理的速度纔會提高,否則頻繁的磁盤數據交換會降低效率。
參考:http://blog.csdn.net/fw0124/article/details/6626370


【嵌入SQL】
嵌入式SQL(英文: Embedded SQL)是一種將SQL語句直接寫入C語言,COBOL,FORTRAN, Ada等編程語言的源代碼中的方法。藉此方法,可使得應用程序擁有了訪問數據以及處理數據的能力。在這一方法中,將SQL文嵌入的目標源碼的語言稱爲宿主語言。
1、C語言中嵌入SQL
編碼形式:
EXEC SQL SQL文 ;
示例
1、申明:EXEC SQL BEGIN DECLARE SECTION ;
2、FETCH:EXEC SQL FETCH CU1 INTO :GNO, :GOOD, :QOH ;


include和表申明
示例:
HOSTVAR文件內容
char SQLSTATE[6];
long STOCK;

嵌入式SQL
EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL INCLUDE HOSTVAR;
EXEC SQL END DECLARE SECTION;
main(){
EXEC SQL DECLARE repositor TABLE ON SCH1;
EXEC SQL SELECT num INTO :STOCK FROM repositor WHERE goodsnum = 240;
printf("%d\n",STOCK);
}

指定host變量
示例:
EXEC SQL SELECT repositorysum,repositorynum
INTO :STOCK INDICATOR :QFLAG,
:HOUSE INDICATOR :WFLAG
FROM repository WHERE repositorynum = 110;
QFLAG爲STOCK標誌變量,變量需要使用“:”

SQL文以外C代碼使用變量,變量不需要“:”
EXEC SQL FETCH CU1 INTO :STOCK INDICATOR :QFLAG;
if( QFLAG == -1) goto p_null ;
if( STOCK == 0) goto p_loop ;

連接和斷開數據庫
EXEC SQL CONNECT TO 'SV1' AS 'C1' USER 'U/PW';
此時,動作環境配置文件:
SERVER_SPEC=(RDB2_TCP,SV1,DB01,H1,26511)


EXEC SQL CONNECT TO DEFAULT;
此時,動作環境配置文件:
SERVER_SPEC=(RDB2_TCP,SV1,DB01,H1,26511)
DEFAULT_CONNECTION=(SV1,U,PW)


參考:
http://www.cnblogs.com/lyhabc/archive/2013/12/04/3458487.html(推薦)
http://blog.csdn.net/angelseyes/article/details/3962133
http://baike.baidu.com/link?url=x2WE1ZJeA_ot4VifRhLDkpKAtVQxDQlUCyBbvc1a4u2ds-7yYh8rcETMLDdfpAXxTicLo02hNJPkCjFPb22oj-v0Js8_TYipk0Ef2Gi2Vhm


【JDBC】
package     API                     概要
javax.sql   DataSource interface   使用data source
java.sql    DriverManager class     使用url直接指定
推薦使用DataSource方式連接

示例:
Hashtable env = new Hashtable(); (1)
env.put(Context.INITIAL_CONTEXT_FACTORY
"com.fujitsu.symfoware.jdbc2.jndisp.SYMContextFactory"); (1)
env.put(Context.PROVIDER_URL,"SYM://myhost:10326"); (1)
InitialContext ctx = new InitialContext(env); (1)
DataSource ds = (DataSource)ctx.lookup("jdbc/ds1"); (2)
Connection con = ds.getConnection(); (3)

con.setAutoCommit(false); (4)

con.commit(); (5)
con.close(); (6)

(1) JNDI環境指定;
(2) 獲得JDBC Data source;
(3) 連接數據庫;
(4) 自動commit無效化;
(5) 事務commit;
(6) 切斷連接。

事務
設置事務連接模式
Connection cnct = DataSource.getConnection();
cnct.setAutoCommit(false);
cnct.setReadOnly(true);

cnct.commit();

設置事務獨立性
Connection cnct = DataSource.getConnection();
cnct.setAutoCommit(false);
cnct.setTransactionIsolation(java.sql.Connection.TRANSACTION_READ_UNCOMMITTED);

cnct.commit();


Statement、PreparedStatement和CallableStatement
1、Statement繼承自Wrapper、PreparedStatement繼承自Statement、CallableStatement繼承自PreparedStatement;
2、Statement接口提供了執行語句和獲取結果的基本方法、PreparedStatement接口添加了處理IN參數的方法、CallableStatement接口添加了處理OUT參數的方法;
3、PreparedStatement:
由DBMS預編譯並緩存在cache中,所以執行可變參數的一條SQL時,PreparedStatement比Statement的效率高,因爲DBMS預編譯一條SQL當然會比多次編譯一條SQL的效率要高。
安全性更好,有效防止sql注入問題。
執行的SQL語句中是可以帶參數的,並支持批量執行SQL。
參考:http://langgufu.iteye.com/blog/1559386

示例:
PreparedStatement pstmt = con.prepareStatement(
"SELECT ID,NAME FROM
GENERAL.EMPLOYEE WHERE ID=?"); (1)
pstmt.setInt(1, 1); (2)
ResultSet rs = pstmt.executeQuery(); (3)
int iID = 0; (3)
String sName = null; (3)
while (rs.next()) (4)
{ (4)
iID = rs.getInt(1); (5)
sName = rs.getString(2); (5)
System.out.println("ID = " + iID); (5)
System.out.println("NAME = " + sName); (5)
} (5)
rs.close(); (6)
pstmt.close(); (6)
con.commit();(7)
(1) SQL文準備;
(2) 設定參數,第一個1表示第一個參數;
(3) ResultSet 對象生成;
(4) 基於cusor的位置;
(5) 從ResultSet對象中獲得;
(6) 關閉對象;
(7) 事務提交。

execute、executeQuery和executeUpdate
1、executeQuery:返回結果集(ResultSet);
2、executeUpdate: 執行給定SQL語句,該語句可能爲 INSERT、UPDATE 或 DELETE 語句,
或者不返回任何內容的SQL語句(如 SQL DDL 語句);
3、execute: 可用於執行任何SQL語句。
參考:http://kanghao126.iteye.com/blog/134697

二進制文件檢索
示例:
Statement stmt = con.createStatement(); (1)
ResultSet rs = stmt.executeQuery(
"SELECT COL_BLOB FROM BLOBTBL WHERE COL_INT = 1"); (2)
while (rs.next()) (3)
{
InputStream oIS = rs.getBinaryStream(1); (4)
FileOutputStream fs = new FileOutputStream("文件名"); (4)
byte[] bTmp = new byte[oIS.available()]; (5)
oIS.read(bTmp); (5)
fs.write(bTmp); (5)
int iBData=0; (6)
while ((iBData=oIS.read()) != -1) (6)
{
fs.write(iBData); (6)
}
oIS.close(); (7)
fs.close(); (7)
}
rs.close(); (8)
stmt.close(); (8)
con.commit(); (9)
(1) 爲了執行SQL文,生成Statement對象;
(2) 生成ResultSet對象;
(3) 基於cusor位置;
(4) 從ResultSet對象中獲得;
(5) 從流中讀入(byte數組);
(6) 從流中讀入(1位);
(7) 關閉流;
(8) 關閉對象;
(9) 事務提交。

二進制文件更新
PreparedStatement pstmt = con.prepareStatement(
"INSERT INTO BLOBTBL VALUES(1, ?)"); (1)
FileInputStream oFIS = new FileInputStream("文件名"); (1)
pstmt.setBinaryStream(1, oFIS, oFIS.available()); (2)
pstmt.executeUpdate(); (3)
oFIS.close(); (3)
pstmt.close(); (4)
con.commit(); (5)
(1) SQL文準備;
(2) 設置參數;
(3) 執行SQL;
(4) 關閉對象;
(5) 事務提交。

【ODBC】
ODBC(Open Database Connectivity)美國微軟Microsoft公司提倡的Windows程序連接的標準接口。
ODBC應用--ODBC驅動管理--ODBC驅動(ODOS)--symfoware DB
可以使用ODBC的應用程序Access、Excel、Visual Basic、Visual Basic.NET、IIS、Visual C++、富士通NetCOBOL/PowerCOBOL97、Macromedia ColdFusion。

一、應用設計
接口API:RDO(推薦)、ADO、ADO.NET;
連接數據庫:
API名           對象名            方法名
RDO        rdoEnvironment     OpenConnection
ADO        Connection         Open
ADO.NET    OdbcConnection     Open
需要設置以下參數
DSN(數據源Num)=DSN01;UID=USER01;PWD=PASS01;

斷開數據庫:
API名           對象名            方法名
RDO        rdoEnvironment     Close
ADO        Connection         Close
ADO.NET    OdbcConnection     Close


ODBC連接池技術
1、CPTimeout值
CPTimeout超時後連接自動釋放。初始化爲60秒。指定爲0時,連接池無效。
2、Retry Wait值
Retry Wait等待重試時間,初始化爲120秒。
3、ODBC數據源管理
1)Windows(R)控制面板,執行ODBC;
2)選擇【連接池】類型;
3)連接池技能使用確認頁面,performance選項:有效;
4)如果要更改Retry Wait值,以秒爲單位設置:重試等待時間;
5)連接池超時選項,雙擊Symfoware ODOS或Symfoware ODOS(UniCode);
6)選擇連接池連接這個驅動;
7)設置CPTimeout;
8)OK。

確認連接池狀態
performance監控器啓動狀態下,追加[ODBC Connection Pooling]
Connections Currently Active:正在使用的連接數;
Connections Currently Free:未使用的連接數;
Connections Sec/Hard:每秒來自datasource連接數;
Connections Sec/Soft:每秒來自連接池的連接數;
Disconnections Sec/Hard:每秒斷開datasource連接數;
Disconnections Sec/Soft:每秒斷開連接池的連接數。

二、設置環境
註冊數據源
兩種ODOS對應編碼:
Symfoware ODOS
Symfoware/RDB可以在shift_jis或者euc編碼下使用;
Symfoware ODOS(UniCode)
Symfoware/RDB可以在UNICODE編碼下使用。

註冊ODBC數據源手順:
1、管理頁面啓動ODBC數據源(或者直接找到exe文件C:\WINDOWS\SysWOW64\odbcad32.exe);
2、根據使用數據源的用戶選擇【用戶數據源】或者【系統數據源】;
3、點擊【追加】按鈕;
4、數據源新規頁面選擇Symfoware ODOS或者Symfoware ODOS(UniCode),然後點擊【完了】按鈕;
5、Symfoware ODOS setup頁面填入必要信息,點擊【OK】按鈕(必要信息參照:Symfoware Server Enterprise Edition V10.1.0)。

三、應用程序作成和執行
與Office聯合(主要包括Access和Excel);

與Visual Basic.Net聯合(使用平臺Visual Studio 2005。);
有以下連接方式:RDO、ADO、ADO.NET、DAO,其中ADO.NET依賴於ODBC.NET Data Provider
和.NET Framework SDK。

應用程序作成準備
1)ODBC數據源作成;
2)啓動Visual Studio;
3)創建新的Visual Basic項目:【Windows應用程序】--【OK】;
4)Visual Studio菜單欄【project】-[追加參照];
5)【追加參照】頁面選擇適當的項目,點擊【OK】
- Visual Basic.NET的RDO場合、【COM】Tab選擇【Microsoft Remote Data Object 2.0】;
- Visual Basic.NET的ADO場合、【COM】Tab選擇【Microsoft ActiveX Data Objects 2.7 Library】。

作成和執行
1、在form上添加兩個button按鈕(連接和切斷);
2、切換到【Text】,這隻連接和切斷;
3、菜單的【表示】-【code】選擇,然後在【code】畫面下拉菜單選擇全部;
4、移動遊標,設置以下代碼
外部可能使用的變量聲明
Private rdoEV As RDO.rdoEnvironment
Private rdoCN As RDO.rdoConnection
Private rdoEN As New RDO.rdoEngine
畫面表示時不可以點擊切斷按鈕設定
Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs)
Handles MyBase.Load
Button2.Enabled = False
End Sub

5、頁面上點擊【連接】按鈕,遊標移動到以下代碼
On Error GoTo ErrorProc
rdoEV = rdoEN.rdoCreateEnvironment("", "", "")
rdoEV.CursorDriver = RDO.CursorDriverConstants.rdUseOdbc
rdoCN = rdoEV.OpenConnection("", RDO.PromptConstants.rdDriverPrompt, "ODBC;")
MsgBox("可以連接", MsgBoxStyle.OkOnly, "連接成功")
Button2.Enabled = True
Button1.Enabled = False
Exit Sub
ErrorProc:
Dim msg As String
Dim i As Integer
For i = 0 To rdoEN.rdoErrors.Count - 1
If rdoEN.rdoErrors.Count > 0 Then
msg = rdoEN.rdoErrors(i).Description
Else
msg = Err.Description
End If
MsgBox(msg, MsgBoxStyle.OkOnly, "Error")
Next
rdoCN = Nothing
rdoEV = Nothing
End Sub

6、form頁面點擊切斷按鈕,遊標移動到以下代碼
rdoCN.Close()
rdoEV.Close()
rdoEV = Nothing
rdoCN = Nothing
Hide()
Close()

與IIS聯合
需安裝以下產品:ODBC.NET Data Provider、.NET Framework SDK。
環境設置:
1、創建倉庫文件;
2、設置IIS;
3、註冊ODBC數據源。

應用程序作成
ASP應用程序:
示例:
<%@ language="vbscript" %>
<!-- #include file = "adovbs.inc" -->
<html>
<head>
<title>數據展示</title>
</head>
<body bgcolor="White">
<b>數據展示</b>
<hr>
<%
consrc = "DSN=DSN01;UID=USER01;PWD=PASS01"
sqlsrc = "SELECT KEY_C,DEC_C FROM SAMPLE1.TESTTBL"
' 獲取錯誤,當錯誤發生是不能中斷程序
On Error Resume Next
'0. Connection對象的生成和設置
Set OBJdbConnection = Server.CreateObject("ADODB.Connection")
OBJdbConnection.ConnectionString = consrc
Response.Write "1.connection連接<br>"
OBJdbConnection.Open
'錯誤處理
If OBJdbConnection.Errors.Count > 0 Then
Response.Write "Description = " & _
OBJdbConnection.Errors(0).Description & "<br>"
Response.Write "NativeError = " & _
OBJdbConnection.Errors(0).NativeError & "<br>"
Response.Write "Number = " & _
OBJdbConnection.Errors(0).Number & "<br>"
Response.Write "Source = " & _
OBJdbConnection.Errors(0).Source & "<br>"
Response.Write "SQLState = " & _
OBJdbConnection.Errors(0).SQLState & "<br>"
End If
Response.Write "2.Recordset對象生成<br>"
Set RecordSetObj = Server.CreateObject("ADODB.Recordset")
Response.Write "3.Recordset對象打開く<br>"
RecordSetObj.Open sqlsrc,OBJdbConnection,adOpenForwardOnly, _
adLockReadOnly,adCmdText
'錯誤處理
If OBJdbConnection.Errors.Count > 0 Then
Response.Write "Description = " & _
OBJdbConnection.Errors(0).Description & "<br>"
Response.Write "NativeError = " & _
OBJdbConnection.Errors(0).NativeError & "<br>"
Response.Write "Number = " & _
OBJdbConnection.Errors(0).Number & "<br>"
Response.Write "Source = " & _
OBJdbConnection.Errors(0).Source & "<br>"
Response.Write "SQLState = " & _
OBJdbConnection.Errors(0).SQLState & "<br>"
Else
Response.Write "4.獲得數據<br>"
Response.Write "KEY_C,DEC_C<br>"
Do While Not RecordSetObj.EOF
For i = 0 To RecordSetObj.Fields.Count - 1
'獲得數據
Response.Write CStr(RecordSetObj.Fields(i)) + ","
Next
Response.Write "<br>"
RecordSetObj.MoveNext
Loop
End If
Response.Write "5.Recordset對象關閉<br>"
RecordSetObj.Close()
Response.Write "6.connection切斷<br>"
OBJdbConnection.Close
%>
<hr>
</body>
</html>

ASP.NET應用程序:
1、啓動Visual Studio .NET;
2、新建ASP.NET應用程序;
3、Visual Basic .NET菜單選擇【project】--【追加參照】--【.NET】Tab選擇【Microsoft.Data.ODBC.dll】;
4、編輯Form,添加執行按鈕;
在design頁面html的body頁面:
<body>
<form id="Form1" method="post" runat="server">
<FONT face="MS UI Gothic">
<asp:button id="Button1" runat="server" Text="執行" Width="68px"></asp:button>
<HR width="100%" SIZE="1">
<asp:label id="Label1" runat="server"></asp:label>
<HR width="100%" SIZE="1">
</FONT>
</form>
</body>

5、點擊form頁面【執行】按鈕,遊標移動到以下代碼
Dim con As Microsoft.Data.Odbc.OdbcConnection
Dim com As Microsoft.Data.Odbc.OdbcCommand
Dim drd As Microsoft.Data.Odbc.OdbcDataReader
Dim i As Integer
Dim msgstr As String
Dim constr As String = "DSN=DSN01;UID=USER01;PWD=PASS01"
Dim sqlstr As String = "SELECT KEY_C,DEC_C FROM SAMPLE1.TESTTBL"
Try
Label1.Text = "1.connection連接<br>"
con = New Microsoft.Data.Odbc.OdbcConnection(constr)
con.Open()
Label1.Text &= "2. OdbcCommand對象生成<br>"
com = New Microsoft.Data.Odbc.OdbcCommand(sqlstr, con)
Label1.Text &= "3. OdbcDataReader對象生成<br>"
drd = com.ExecuteReader
Label1.Text &= "4. 取得數據<br>"
Label1.Text &= "KEY_C,DEC_C<br>"
While drd.Read()
For i = 0 To drd.FieldCount - 1
Label1.Text &= drd.GetValue(i) & ","
Next
Label1.Text &= "<br>"
End While
Label1.Text &= "5. OdbcDataReader對象關閉<br>"
drd.Close()
Label1.Text &= "6. connection切斷<br>"
con.Close()
con.Dispose()
com.Dispose()
'Error處理
Catch ex As Microsoft.Data.Odbc.OdbcException
For i = 0 To ex.Errors.Count - 1
msgstr &= ex.Errors(i).Message & "<br>"
msgstr &= "SQLSTATE: " & ex.Errors(i).SQLState & "<br>"
Next
Label1.Text = "ODBC Error Message<br>" & msgstr
Catch ex As Exception
msgstr = ex.Message
Label1.Text = "Error Message<br>" & msgstr
End Try

6、運行程序,在瀏覽器中輸入http://localhost/ASPSamp/TestWebApl/WebForm1.aspx訪問(具體路徑依程序而定)。

【Symfoware .NET Data Provider】
動作環境:
1、.NET Framework 2.0、.NET Framework 3.0、.NET Framework 3.5或.NET Framework 4
2、Visual Studio 2005、Visual Studio 2008或Visual Studio 2010

開發語言
C#
Visual Basic .NET
COBOL

應用程序作成
Symfoware .NET Data Provider setup
1、Windows程序【project】--【追加參考】,Web程序【web site】--【追加參照】;
2、【.NET】Tab選擇【Fujitsu.Symfoware】,點擊【OK】;

數據操作的自動生成
Symfoware.NET Data Provider數據操作,VisualStudio生成可能的數據操作標準的代碼(ODBC橋代碼)的基礎,SNDP代碼生成工具自動生成。
1、project作成;
2、Symfoware .NET Data Provider 的setup;
3、用戶界面作成;
4、ODBC數據源連接的作成;
5、ODBC橋代碼自動生成;
6、Symfoware .NET Data Provider(SNDP)代碼生成,SNDP使用shell,從自動生成的ODBC橋代碼中自動生成;
7、應用程序邏輯代碼,調用自動生成的代碼,connection作成。

調用自動生成代碼以及創建connection示例:
1)C#
private void Form1_Load(object sender, EventArgs e)
{
this.SNDP_InitializeComponent();
this.SNDP_odbcConnection1.ConnectionString = "DATA SOURCE=127.0.0.1;PORT=26551;" +
"INITIAL CATALOG=TEST;USER ID=root;PASSWORD=PASS01";
}

2)Visual Basic .NET
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.SNDP_InitializeComponent()
Me.SNDP_OdbcConnection1.ConnectionString = "DATA SOURCE=127.0.0.1;PORT=26551;" _
& "INITIAL CATALOG=TEST;USER ID=root;PASSWORD=PASS01"
End Sub

【connection manager】
Connection Manager和應用程序運行在同一臺機器上,並且有一部分功能內嵌在客戶端API驅動(JDBC,ODBC等)裏。應用程序通過API驅動透明地向Connection Manager請求一個虛擬的服務器,ConnectionManager將這個虛擬服務器名翻譯成一組節點的IP和端口號,並根據節點的運行狀況(生死,負載,Log Group偏在)選擇一個最合適的節點返回給應用,通過這種方式還可以達到負載均衡的目的。

環境設定
數據庫Server環境設定
1、編輯動作環境文件;
MAX_CONNECT_TCP = (連接數):可用最大連接數
RDB_KEEPALIVE = ({ON|OFF}):設置KEEPALIVE功能是否可用

2、設置環境變量;
設置使用APC command、rdbprtmsg command或man command必要的環境變量
示例(linux):
$ LANG= ja_JP.UTF-8 ; export LANG
$ PATH=/opt/FJSVapccm/bin:$PATH ; export PATH
$ LD_LIBRARY_PATH=/opt/FJSVapccm/lib:$LD_LIBRARY_PATH ; export LD_LIBRARY_PATH
$ RDBNAME=rdbsys1 ; export RDBNAME
$ MANPATH=/opt/FJSVapccm/man:$MANPATH ; export MANPATH

3、設置端口號
通信使用端口號以及down監控端口號
Solaris/Linux:/etc/services
windows:C:\WINDOWS\system32\drivers\etc\services
示例:
rdbsys1 26551/tcp
rdbsys1-spv 26700/tcp

4、設置系統日誌環境變量。

應用程序環境設置
Solaris/Linux:
kernel編輯
APC動作環境文件編輯
系統日誌環境設置
環境變量設置
windows:
APC動作環境文件編輯
環境變量設置

APC動作環境文件編輯
Solaris/Linux:
/opt/FJSVapccm/etc/apcsysconfig
windows:
安裝目錄下\CM\ETC內文本文件,apcsysconfig.sam、apcsysconfig同名文件夾復製作成。

服務端啓動停止
服務端啓動:rdbstart 此時應用程序纔可以啓動
服務端停止:rdbstop  停止時應用程序無法執行啓動,應用程序啓動時,服務端無法停止

應用程序啓動命令apcstart,查看狀態命令apcnet
示例1:(服務器運行中)
$ apcstart
$ apcnet
apcnet DATE:2007/01/10 TIME:10/30/55
System Host Status Cause
rdbsys1 host1 online -
(rdbsys1) host3 online -
rdbsys2 host2 online -
(rdbsys2) host3 online -
示例2:(服務停止器運行)
$ apcstart
$ apcnet
apcnet DATE:2007/01/10 TIME:10/30/55
System Host Status Cause
rdbsys1 - offline CON
rdbsys2 - offline CON

應用程序停止命令:apcstop


監控進程啓動(Solaris/Linux)
$ rdbstart
$ rdbcrbf -f /home/rdbcrbf_file
$ rdbconbf -f /home/rdbconbf_file
$ rdbresident -mon -f /home/rdbresident_file
$ apcspv

監控進程停止(沒有停止命令,停止Server,監控進程自動停止)


應用程序作成示例(java)
import java.sql.*;
import java.util.Hashtable;
import java.net.URL;
import javax.sql.DataSource;
import javax.naming.*;
/*
* JdbcSample1.java
* 內容:使用JDBC API示例程序
*/
class JdbcSample1
{
/*** main ***/
public static void main(String args[]){
try{
int result = -1;
/* CONNECT */
DBAccess dbAccess = new DBAccess();
/* PREPARE */
dbAccess.createObj();
while (result == -1)
{
/* EXECUTE */
result = dbAccess.exec();
// SQLState爲40003,40703,71410的情況、再次執行exec()。
if(result == -2 | result == -3)
{
result = -1;
}
// 正常結束、其他錯誤出現,程序終止
else{
break;
}
}
/* DISCONNECT */
dbAccess.close();
}
catch(Exception e)
{
/* 異常處理 */
e.printStackTrace();
}
}
}
/*
* 數據庫access處理
*/
class DBAccess
{
private Connection con = null;
private PreparedStatement pstmt = null;
private int iRollback = 0;
/* 連接數據庫 */
DBAccess(){
try{
Hashtable env = null;
DataSource ds = null;
Context ctx = null;
String sDataSourceName = "DS1";
String sProviderName = "com.fujitsu.symfoware.jdbc2.jndisp.SYMContextFactory";
String sProviderURL = "SYM://localhost:26600";
env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, sProviderName);
env.put(Context.PROVIDER_URL, sProviderURL);
ctx = new InitialContext(env);
String key_ = "jdbc/" + sDataSourceName;
ds = (DataSource)ctx.lookup(key_);
/* 連接數據庫 */
con = ds.getConnection();
/*設置爲手動commit */
con.setAutoCommit(false);
}
catch (SQLException e){
System.out.println(e.getMessage());
System.out.println("SQLState = <" + e.getSQLState()
+ ">, Code = <"+ e.getErrorCode() + ">");
e.printStackTrace();
}
catch (NamingException e){
e.printStackTrace();
}
}
/*
* statement作成
*/
public void createObj()
{
String sSQLInsert = "INSERT INTO SCM1.CATEGORY1 VALUES(?, 'NAME')";
try{
/* PreparedStatement作成 */
pstmt = con.prepareStatement(sSQLInsert);
}
catch (SQLException e)
{
System.out.println(e.getMessage());
System.out.println("SQLState = <" + e.getSQLState()
+ ">, Code = <"+ e.getErrorCode() + ">");
e.printStackTrace();
}
}
/*
* SQL文執行
*/
public int exec()
{
int result = -1;
try
{
// SQLSTATE爲71410的時候、rollback。
if(iRollback == 1)
{
con.rollback();
pstmt.close();
createObj();
iRollback = 0;
}
/* 插入5條數據 */
for (int i = 1; i <= 5; i++)
{
pstmt.setInt(1, i);
result = pstmt.executeUpdate();
}
/* PreparedStatement關閉 */
pstmt.close();
/*事務提交 */
con.commit();
}
catch (SQLException e)
{
String sErr1 = "40003";
String sErr2 = "40703";
String sErr3 = "71410";
String sErr4 = "71003";
String prefix = e.getSQLState();
// SQLSTATE爲40003或40703的時候、再次執行。
if (prefix.equals(sErr1) || prefix.equals(sErr2))
{
result = -2;
}
// SQLSTATE爲71410或71003的時候、再次執行。
// 設置rollback flag 。
else if (prefix.equals(sErr3) || prefix.equals(sErr4))
{
result = -3;
iRollback = 1;
}
// 其他錯誤場合,返回錯誤。
else
{
System.out.println(e.getMessage());
System.out.println("SQLState = <" + e.getSQLState()
+ ">, Code = <"+ e.getErrorCode() + ">");
result = 1;
}
}
return result;
}
/*
* 對象回收處理
*/
public void close()
{
try
{
// Connection關閉
con.close();
}
catch (SQLException e)
{
System.out.println(e.getMessage());
System.out.println("SQLState = <" + e.getSQLState()
+ ">, Code = <"+ e.getErrorCode() + ">");
e.printStackTrace();
}
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章