取得情報を一覧表示するロジックについて – プログラミング – Home

取得情報を一覧表示するロジックについて
 
通知
すべてクリア

[解決済] 取得情報を一覧表示するロジックについて


あうあう
 あうあう
(@あうあう)
ゲスト
結合: 22年前
投稿: 12
Topic starter  

画面起動時にMDBよりデータを取得してJTable
に一覧を表示させるプログラムを作っています。

↓以下、表示ルーチン
model = DefaultTableModelです。

rs = db.getResultSet(select * from table_a);

while(rs.next())
{
Vector vecRow = new Vector(); -----気になるのがここ 

for(i=1;i<7;i++) {
vecRow.addElement(rs.getString(i));
}

model.addRow(vecRow);
}

プログラムは動作しますが、Vector vecRow = new Vector()
が気になり質問させて頂きました。
このプログラムですとレコードセットの数分、アロケートしてしまい
多分この関数を抜ける迄、そのアロケートした領域は解放されない
のでは?と思い、以下のようにプログラムを変更しました。

↓変更プログラム
Vector vecRow = new Vector();//whileループの外に出した。

while(rs.next())
{
if (vecRow.isEmpty() == false) {
vecRow.clear();
}   

そうしますと、動作はしますが一覧に表示される情報が全て
最後に取得したレコードセットの値になってしまいます。
C++みたいにvecRowをdeleteできれば上記のロジックでとりあえず
いいのですが・・・。
あともう一つ思いついたのですが、getResultSetの戻り値をResultSet
でなくVectorにして(以下)

public class database
{
private Vector m_rowData = null;

public Vector getResultSet(CString strSQL)
{
   ・・・・・・・・・・途中は省略・・・・・・・・
m_rowData = getFieldDt(recset);
 ・・・・・・・・・・途中は省略・・・・・・・・
return m_rowData;
}

public Vector getFieldDt(ResultSet recset)
{
Vector vecRow;

vecRow = new Vector();
・・・・・・・・・・途中は省略・・・・・・・・        
return (recset)
}

これで行けると思いますが、皆さんはJAVAの場合、
このような情報一覧を表示するプログラムはどのような
コーディングをされてますでしょうか?宜しくお願いします。
ちなみにJAVA暦3日です。


引用未解決
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

>このプログラムですとレコードセットの数分、アロケートしてしまい
>多分この関数を抜ける迄、そのアロケートした領域は解放されない
>のでは?と思い、以下のようにプログラムを変更しました。

アロケートされた領域はどの変数からも参照されなくなった後、
必要に応じて解放されます。メモリに余裕があれば
解放されないこともあります。

>そうしますと、動作はしますが一覧に表示される情報が全て
>最後に取得したレコードセットの値になってしまいます。

こうなるということは、DefaultTableModelはaddRowで渡された
Vectorオブジェクトを内部でそのまま保持していて、使っているということです。

>あともう一つ思いついたのですが、getResultSetの戻り値をResultSet
>でなくVectorにして(以下)

これはVectorをnewする場所が変わっただけで、
最初のプログラムとメモリの使用に関しては変わりありません。


返信引用
あうあう
 あうあう
(@あうあう)
ゲスト
結合: 22年前
投稿: 12
Topic starter  

dairygoodsさんはじめまして。
お返事有難うございます。

>アロケートされた領域はどの変数からも参照されなくなった後、
>必要に応じて解放されます。メモリに余裕があれば
>解放されないこともあります。

そうだったんですね。手持ちの本によるとアロケートした関数を
抜ける迄解放されないと書いてあったので、レコード数分メモリ
を確保し続けるのかと思ってました。

>これはVectorをnewする場所が変わっただけで、
>最初のプログラムとメモリの使用に関しては変わりありません。

これはよ~く考えるとその通りですね・・・。

それであれから、考えた末以下の手順で作ろうかと思います。(まだできてない)

1.Vectorの配列オブジェクトを20個分用意
2.結果セットを保持する。
3.20レコード分表示(該当情報が20件以上の場合)
4.スクロールバーをクリックしたら2.の処理を行う(該当情報が20件以上の場合)。

今はaddAdjustmentListenerとかを調べている所ですが、
多分できるでしょ。とりあえず解決とさせて頂きます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました