現在、社内で勉強がてら、社内用アプリケーションを開発しております。
環境は以下です。

・Windows2003ServerR2
・Apache2.2.11
・Tomcat6
・MySQL5.1
・Java1.6
フレームワークを使わずに、JSP/サーブレットで開発しております。

submitして、ブラウザの「戻る」を何度も繰り返したりして
DB接続するサーブレットを何度も実行すると
「SQLNestedException」エラーになり、
サーバーリブート(もしくはtomcat/mysqlサービス再起動)
しない限り、アプリに接続できなくなってしまいます。

tomcatのstdout.logには、以下が出力されております。
-------------------------------------------------------↓
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object
at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:104)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)



-------------------------------------------------------↑

connectionのclose()をすれば良いようなことが、
ネットで調べてあったのですが、
射た感じの情報が
見つからなかったので、投稿させていただきました。

SJC-Pのバージョン5.0を取ってはいますが、
元々NotesDominoの開発が長く、JSPは初心者で、
申し訳ありません。

ご教示いただけるとありがたいです。

【補足】
すみません。try{}catchのcatch側に、close()を入れてませんでした。
しかし、close()を入れてないからといってサーバリブート(サービスリブート)しないかぎり、鍵が開けられないような感じになっているのは
なんか変ですね。

引き続き調べてみますが、解る方いらっしゃいましたら、よろしくお願いいたします。
他力本願かもですが、生産性向上思考で、情報ご提供お願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (7件)

携帯ブラウザの×を押されても、一定期間たてばセッションタイムアウトでsessionDestroyedメソッドが呼ばれるのではないでしょうか?(多分)


例えPCのブラウザでも電源をいきなり切れば同じ事です。
セッションタイムアウトは一定時間操作しなければ発生します。
コネクション数の上限とタイムアウトの時間を何分とるかです。
    • good
    • 0

これは正攻法では無いと思うのですが、ブラウザを閉じた時や、別の


ページを表示した時の方法の一例として取扱いください。
JavaScriptを用い、onUnloadイベントが発生した時に、セッションや
コネクションを削除するサーブレットを呼び出す方法です。
---------------
<SCRIPT language="JavaScript">
<!--
function byeWin(){
document.form1.closeWin.value = "true";
document.form1.submit();
}
//-->
</SCRIPT>

<body onUnload="byeWin()">
<form action="hoge" method="POST" name="form1">
<input type="hidden" name="closeWin" value="">
・・・
</form>
---------------

サーブレット側にて、
---------------
String closeWin = request.getParameter("closeWin");
if( closeWin.equals("true") ){
// セッション、コネクション削除
HttpSession session = request.getSession(true);
Connection con = (Connection)session.getAttribute("con");
if( con != null){
con.close();
}
session.invalidate();
}
・・・
---------------
という感じでしょうか。
(つっこみ所は多々ありますが、実際にシステムで使用してます)
ただし、携帯電話ではダメでしょうし、ブラウザ等、環境によっては
NGかもしれませんし、あくまでも一例として。

この回答への補足

お忙しい中、回答ありがとうございます。

参考にさせていただきます。

もともと作ろうとしているものが、
ケータイからもアクセス可能なシステムなので、

ケータイブラウザ側の対応も考えたいのですが、

ケータイサイトでDBを使用しているサービスは多々ありますし、

何かしらの対処の方法があると思いますので、
がんばって探してみます。

最悪、毎日リブート運用とか、バッチを仕込むのも考えます。

もし、何か方法が見つかりましたら、情報提供くださるとありがたいです。

補足日時:2009/05/26 17:56
    • good
    • 0
この回答へのお礼

すみません。補足の方に書いちゃいました。

お礼日時:2009/05/26 17:58

すみません。

No4の回答ですが、ブラウザを閉じた事を検知するのは
少々、コツがいるようです。
今、ちょっとしたサンプルが見つからない為、見つかりましたら、
提示したいと思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

無償でお仕事を依頼しているようで、大変恐縮です。

セッションがメモリ上からガベージされるタイミングで呼ばれるなら、
セッションリスナーでいけそうな感じがしましたが。

私の方でも色々調べてみます。

万が一見つかりましたら、
情報いただけるとありがたいです。

お礼日時:2009/05/25 18:10

セッションリスナーをご存知でしょうか?


http://www.ingrid.org/jajakarta/servletapi/servl …

セッション作成時とか消滅時のタイミングで呼ばれます。
sessionDestroyedメソッドは消滅時に呼ばれます(ブラウザを閉じた時等)
インターネットで検索すると幾つかサンプルが出てきますので詳細は
そちらをご覧ください。



ご参考まで。
    • good
    • 0

この例外はDBCPのコネクションプールを受け持つメソッドで発生しています。


コネクションプールはリソースの省資源化、コネクションする際のサーバー負荷軽減などメリットがあります。
また、コネクションプールは通常、最大数が決まっています。
それをオーバーしてしまうとgetConnectionメソッドで、コネクションオブジェクトを返す事ができなくなり、
getConnectionメソッドはコネクションが空くまで(どこかのインスタンスでcloseされるまで)、待ち状態になります。
それが、ずーーーと続いてしまうとタイムアウトで例外発生という仕組みです。(恐らくcontext.xmlファイルのmaxWait設定値を超えたとき)

セッションを作って管理するのが良いと思います。
1つの接続に対し、セッションオブジェクトを生成し、
そのセッションオブジェクト内にコネクションオブジェクトを
置いておく構造にします。そして、そのセッション内に
コネクションオブジェクトがnullならgetConnectionするという
感じです。
若しくは、最初の画面からシステムの機能画面へ遷移する際に
セッションをはり、getConnectionします。
そして、済んだ後、例えば最初の画面へ戻ったとき等に、
コネクションをcloseし、セッションを無効化する。

という事で、ご参考まで。
    • good
    • 0
この回答へのお礼

皆様ご回答ありがとうございます。
初めて投稿するもので、あまりの回答の早さに驚いております。

セッションで管理するのがよさげなのですね。
ちょっとやってみます。

気になるのですが、ブラウザの「×」で閉じた場合、
セッションの破棄は「invalidate()」をされないと思うので、コネクションプールは開いたままになってしまうような気がするのですが。

ケータイでもアクセスできるようなシステムを作りたいと思ってまして、
その場合、JavaScriptのonUnloadでSubmitさせるとかはできないと思うので。

以下の2案のような対処方法があったらいいと思うのですが、なさそうですね。

・バックグラウンドでコネクションプーリングを監視するJavaプログラムとかを常駐させといて、使われてなくて開いているコネクションプーリングがあったら閉じる

・getConnectionは新規にコネクションプールを取得するメソッドですので、getActiveConnectionみたいな、開いていて使われてないコネクションを取得するメソッドがあればいいのですが、APIリファレンスを見る限りなさそうですね。

お礼日時:2009/05/25 16:55

いやいやいや


ずばりconnectionをcloseしていないのが原因よ。
データベースが接続を許可している数が
例えば50となっている場合、
connectionを50個ゲットしたら
次の51個目はゲットできないわ。

そうなると強制的にDBとのコネクションを切らない限り
次のコネクションを生成することができないのよ。
    • good
    • 0

http://atbb.jp/kurimaru/viewtopic.php?p=39

↑の状況に似てる気がします。

>今回は web アプリケーション側で、SQL を実行する度に
> BasicDataSource クラスを毎回 new していたため、その都度新たな
> JDBC 接続が生成され、プーリングされていた。
>つまり、sleep プロセスがたまる一方で、これが MySQL の max
>connections を超えたとき Nested Exception が発生した、という
>ことのよう。

DBの接続方法の部分のコードやJDBCドライバーは何を使っているのか?
とかがあればもう少し原因がわかるかもしれず。

>【補足】
>すみません。try{}catchのcatch側に、close()を入れてませんでした。
>しかし、close()を入れてないからといってサーバリブート(サービスリブート)しないかぎり、鍵が開けられないような感じになっているのは
>なんか変ですね。

そんなことはないでしょう、世の中1つの問題が複数のインシデントを引き起こしたりするもんです。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qjava spring でエラーが出て困ってます

spring 超初心者です。cloudfoundyでcronを実行しようとしています。

CronService から@Autowiredで、StartJob_cを呼び出し
更に呼び出されたStartJob_cから、@AutowiredでReadFile_cを呼び出そうとしています。

しかし、Injection of autowired dependencies failed; nested exception
というエラーが出て動きません。

質問1)このような、呼び出しはできないのでしょうか?
質問2)springでこのような、呼び出しをしたい場合、どうするのが良いのでしょうか?




エラー内容は、
[ERROR] [main 11:08:03] (ContextLoader.java:initWebApplicationContext:220) Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cronService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.krams.tutorial.job.StartJob org.krams.tutorial.job.CronService.startJob; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'syncStartJob': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.krams.tutorial.job.ReadFile org.krams.tutorial.job.StartJob_c.readFile_cService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.krams.tutorial.job.ReadFile] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

です。


ロジックサンプルは、以下の通りです。

@Service
public class CronService implements Cron{

protected static Logger logger = Logger.getLogger("service");

@Autowired
@Qualifier("syncStartJob")
private StartJob startJob;

@Scheduled(cron="*/10 * * * * ?")
public void doSchedule() {
logger.debug("cron");
startJob.jobExec();

}
}




@Component("syncStartJob")
public class StartJob_c implements StartJob{
protected static Logger logger = Logger.getLogger("service");

//@Autowired
//private StartJob2 startJob2_cService;

@Autowired
private ReadFile readFile_cService;
@Autowired
private DeleteFile deleteFile_cService;
@Autowired
private ShinchokuFile1LineDel shinchokuFile1LineDel_cService;

public void jobExec() {
// TODO Auto-generated method stub
logger.debug("StartJob");

List<String> strYMDStartArray = new ArrayList();
strYMDStartArray.add("20060701");//0 1
strYMDStartArray.add("20060501");//1 2
strYMDStartArray.add("20060301");//2 3
strYMDStartArray.add("20060101");//3 4
strYMDStartArray.add("20051101");//4 5
strYMDStartArray.add("20050901");//5 6

String strFileName = "";


List<Integer> AYMDCNTData = new ArrayList();
strFileName = "YMDCNT";
AYMDCNTData = this.readFile_cService.readIntData(strFileName);
int intYMDCNT = AYMDCNTData.size();



List<Integer> ACNTData = new ArrayList();
strFileName = "JobCNT";
ACNTData = this.readFile_cService.readIntData(strFileName);
int intJobCNT = ACNTData.size();




String strYMDStart = "";
String strYMDEnd = "";
int intYMDID = 0;
int intJobCounter = 11;
intJobCounter = intJobCounter + intJobCNT;

String sTrailJoken_start = "";
String sTrailJoken_end = "";
String sTrailGaku_start = "";
String sTrailGaku_end = "";

if( intJobCounter == 11){
sTrailJoken_start = "10";
sTrailJoken_end = "10";
sTrailGaku_start = "5000";
sTrailGaku_end = "5000";
}else if(intJobCounter == 12){
sTrailJoken_start = "10";
sTrailJoken_end = "10";
sTrailGaku_start = "10000";
sTrailGaku_end = "10000";
}else if(intJobCounter == 13){
sTrailJoken_start = "10";
sTrailJoken_end = "10";
sTrailGaku_start = "15000";
sTrailGaku_end = "15000";
}else if(intJobCounter == 14){
sTrailJoken_start = "10";
sTrailJoken_end = "10";
sTrailGaku_start = "20000";
sTrailGaku_end = "20000";
}

spring 超初心者です。cloudfoundyでcronを実行しようとしています。

CronService から@Autowiredで、StartJob_cを呼び出し
更に呼び出されたStartJob_cから、@AutowiredでReadFile_cを呼び出そうとしています。

しかし、Injection of autowired dependencies failed; nested exception
というエラーが出て動きません。

質問1)このような、呼び出しはできないのでしょうか?
質問2)springでこのような、呼び出しをしたい場合、どうするのが良いのでしょうか?




エラー内容は、
[ERROR] [main 11:08:03] ...続きを読む

Aベストアンサー

例外のログはこれだけじゃないですよね?

QTomcatを再起動するとエラーが解消する

PostgreSQLを利用したJavaのシステムで、DB更新中に、エラーが発生することがあります。
その後、再処理を行うと、次のメッセージが出ます。

org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted

Tomcatを再起動すると、正常にDB更新が出来るようになります。

ほぼ毎日使っているシステムですが、1月18日と、4月26日の2回発生しています。
どのようなところを調査すればよいか、教えてください。
よろしくお願いします。

Aベストアンサー

こんにちは。

そのままエラーメッセージを検索エンジンにひっかけるといろいろな情報が出てきますよ。

例えば
http://d.hatena.ne.jp/kawam/20060208

エラーメッセージの意味もそのままで、プールを使い果たしてコネクションが取得できないという意味です。

取得したコネクションのclose漏れが原因だと思います。

Connection conn = null;
try {
conn = コネクション取得
// なんかいろいろ処理
conn.close();
} catch ( Exception e ) {
// エラーが起きたとき
}

この場合、なんかいろいろな処理で例外が発生した場合はコネクションが閉じられない状態になります。

Connection conn = null;
try {
conn = コネクション取得
// なんかいろいろな処理
} catch ( Exception e ) {
} finally {
if ( conn != null )
conn.close();
}

こうすると例外が発生しても必ずfinallyを通りますのでコネクションがクローズされます。

コネクション周りを見直してみてください。

こんにちは。

そのままエラーメッセージを検索エンジンにひっかけるといろいろな情報が出てきますよ。

例えば
http://d.hatena.ne.jp/kawam/20060208

エラーメッセージの意味もそのままで、プールを使い果たしてコネクションが取得できないという意味です。

取得したコネクションのclose漏れが原因だと思います。

Connection conn = null;
try {
conn = コネクション取得
// なんかいろいろ処理
conn.close();
} catch ( Exception e ) {
// エラーが起きたとき
}

この場合、なんかいろいろな処理で例外が...続きを読む

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

Qinterface,extend,implementのちがい

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

Aベストアンサー

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば...続きを読む

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Qsqlplusで表示が変なので、出力を整形したい。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------

上記のように意味不明な形式で出てきます。

例えばこんな風に

select カラム1,カラム2,カラム3 from hoge;

カラム1 1の値
---------------------------
カラム2 2の値
---------------------------
カラム3 3の値

等のように分かりやすく表示できないでしょうか?

ちなみにOracle9iR2を使用しています。
sqlに関するツールは使用できないルールでして、あくまでsqlplusのコマンド上でみやすくしなければなりません。

分かりづらくですいませんが、皆さま、ご教授お願いします。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
-----------------------...続きを読む

Aベストアンサー

SQLPLUSを起動して、

SQL>set linesize 列数

でどうだ。

SQL>show linesize

で確認ができる。

QString型の日付(2005/11/25)の比較

Java初心者です。String型で2005/11/25 のように2つString型で日付を取得したときに、大小の比較をしたいのです。どういう方法が考えられますか?よろしくお願いします。

Aベストアンサー

書式がyyyy/mm/ddで決め打ちならば他の方が書かれているとおりString#compareTo()で充分でしょう。
yyyy/m/dなど書式が不定の場合には、java.text.DateFormatを利用してjava.util.Dateに変換して比較するか、/で文字列を分解し、年・月・日を抽出してそれぞれを比較するなどが考えられます。

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

Qequalsの逆

javaで、文字列の場合は比較演算子の「==」は用いずに

if ((str1.getText()).equals(str2)){
(※…str1,2は文字列)

と書きますよね?
この逆で、文字列str1とstr2は等しくないとき、にはif以下の条件文をどのように書けばよいでしょうか?

Aベストアンサー

>if !((str1.getText()).equals(str2)){

あくまで
if(){
}


!(str1.getText()).equals(str2)
が入っているので
if !((str1.getText()).equals(str2)){
じゃなくて
if (!(str1.getText()).equals(str2)){
こう。

Qyyyymmddからyyyy/mm/ddへの変換

いつもお世話になっております。
Aと言う変数にはyyyymmddの値が入っていて
Aをyyyy/mm/ddにしてBの変数に入れたい場合の処理がわかりません。
調べたところ、SimpleDateFormatクラスと言うものを使えばよいと言うことが判明しました。
しかし、今まで使ったことがないのでよくわかりません。
変数Aと変数BはどちらもString型です。
ご教授お願い致します。

Aベストアンサー

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.parse(a);
  formatter.applyPattern("yyyy/MM/dd");
  String b = formatter.format(date);
  System.out.println(b);
}
catch (ParseException ex) {
  System.out.println("解析失敗");
}

 こんな感じでいいんじゃないでしょうか。

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.p...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報