I never had a problem with my kids going to bed, so I am amazed at how many people do have issues with it.
My kids weren't perfect by any means, but when it was bed time, it was bed time. I started it when they were babies and they just didn't mess around about it. Sure, there were nights they were really sick or something like that, but the "I need a drink" or "I'm not tired" never cut it with me. I never had locks on their doors and I never stayed up all night putting them back to bed. But, I sleep trained them early on. They could sleep in their own bed, they could sleep in a hotel crib, they could sleep on Grandma's spare bed...they could sleep anywhere because when it was time to go to bed, it was just time to do it.
You kind of answered your own question when you said it can be up to 2 hours before you cave.
DON'T CAVE.
Everytime you cave in, thinking it will be easier for that night, it just sets you back at square #1. Which, just shows your child that if he wears you down enough, you WILL cave in.
He needs to know you WON'T.
You're the parent and he needs to know that bedtime means being in bed and not getting up and goofing off. No discussions, no debating, no negotiations...in bed means IN BED. Period.
And you have to stick with it. Every single time.
You might be surprised at how well he goes to bed once you implement a couple of rules and stick by them. No locks necessary. No closed doors necessary.
Just get firm and be consistant. He's not used to it, so he will rebel, but you can still get it worked out.
Best wishes.